Manipulating Data - 融合数据框

问题

你想要基于一个给定的列融合两个数据框(像SQL的join)。

方案

# 创建一个将storyid映射到titles上的数据框
stories <- read.table(header=TRUE, text='
   storyid  title
    1       lions
    2      tigers
    3       bears
')

# 创建另一个有数据和storyid的数据框(没有titles)
data <- read.table(header=TRUE, text='
    subject storyid rating
          1       1    6.7
          1       2    4.5
          1       3    3.7
          2       2    3.3
          2       3    4.1
          2       1    5.2
')

# 融合两个数据框
merge(stories, data, "storyid")
#>   storyid  title subject rating
#> 1       1  lions       1    6.7
#> 2       1  lions       2    5.2
#> 3       2 tigers       1    4.5
#> 4       2 tigers       2    3.3
#> 5       3  bears       1    3.7
#> 6       3  bears       2    4.1

如果两个数据框里你想要匹配的列有不同的名字,可以通过选项指定:

# 下面使用的是`id`替换了storyid
stories2 <- read.table(header=TRUE, text='
   id       title
    1       lions
    2      tigers
    3       bears
')

# 融合两个数据框
merge(x=stories2, y=data, by.x="id", by.y="storyid")
#>   id  title subject rating
#> 1  1  lions       1    6.7
#> 2  1  lions       2    5.2
#> 3  2 tigers       1    4.5
#> 4  2 tigers       2    3.3
#> 5  3  bears       1    3.7
#> 6  3  bears       2    4.1

# 注意结果的列名继承第一个数据框 

我们也可以融合多个列:

# 制造更多的数据
animals <- read.table(header=T, text='
   size type         name
  small  cat         lynx
    big  cat        tiger
  small  dog    chihuahua
    big  dog "great dane"
')

observations <- read.table(header=T, text='
   number  size type
        1   big  cat
        2 small  dog
        3 small  dog
        4   big  dog
')

merge(observations, animals, c("size","type"))
#>    size type number       name
#> 1   big  cat      1      tiger
#> 2   big  dog      4 great dane
#> 3 small  dog      2  chihuahua
#> 4 small  dog      3  chihuahua

注意

融合之后,改变列名的顺序可能是 有用的,参见../Reordering the columns in a data frame 。

你可能感兴趣的:(Manipulating Data - 融合数据框)