我有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与数据帧列表相匹配。
答案 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个不同行,它就会起作用。