将数据帧与数据帧列表匹配,并将新变量添加到R中的列表中

时间:2012-03-27 21:21:56

标签: r

我有2个独立的数据框

df1

ID      Name     loq
1        a       1.2 
1        b       1.4
1        c       1.0
2        a       0.5
2        b       0.7
2        c       0.3
3        a       0.5
3        b       0.2
3        c       0.1        

df2这是一个数据帧列表

[1]  ID     Name   
     1       a 
     3       b
     2       c
     2       a

 [2]  ID     Name
      3      c
      2      b
      2      a
      1      c

df2的结果如下所示

  [1]  ID     Name   loq 
     1       a     1.2
     3       b     0.2
     2       c     0.3
     2       a     0.5

 [2]  ID     Name    loq
      3      c       0.1
      2      b       0.7
      2      a       0.5
      1      c       1.0

我有很长的数据帧列表。

我想从df1到df2列表中添加匹配ID和名称,并根据匹配将名为loq的新变量添加到df2列表中。

我知道如何在数据框中执行匹配变量,但不知道如何将df与数据帧列表相匹配。

1 个答案:

答案 0 :(得分:3)

保持基础,做你想做的事情是非常简单的:

# Create the data frames/lists
df1 <- data.frame(
  ID   = gl(3,3), 
  Name = rep(letters[1:3], 3), 
  loq  = c(1.2, 1.4, 1.0, 0.5, 0.7, 0.3, 0.5, 0.2, 0.1)
)
df2 <- list()
df2[[1]] <- data.frame(ID = factor(c(1, 3, 2, 2)), Name = c('a', 'b', 'c', 'a'))
df2[[2]] <- data.frame(ID = factor(c(3, 2, 2, 1)), Name = c('c', 'b', 'a', 'c'))

lapply(df2, merge, y = df1)  # merge df2 list elements accordingly to df1

您也可以手动指定要合并的内容。在这种情况下,它会查找匹配的列名:c(ID,Name)。如果你想把df2放到数据帧中,你可以做类似

的事情
do.call("rbind.data.frame", df2)  # uses df2 list elements as arguments to rbind

这里的关键是列ID和名称​​唯一定义记录(在数据库术语中,它们必须是该数据表(帧)的复合主键)。这样,通过df1中的匹配来合并(连接)df2列表元素(数据帧)将不会遇到重复,因此也会出现问题。也就是说,只要不存在具有相同ID和名称值的2个不同行,它就会起作用。