比较两个数据帧,如果匹配多个条件,则从df2到df1获取值

时间:2015-04-13 11:34:21

标签: r

所以,我遇到了这个问题,我已经解决了一段时间,但可以而且不应该再这样了。这可能是一项简单的任务,但是我无法抓住它并且在SO上找不到任何类似的问题。

假设我需要数据帧,df1和df2。

df1 <- data.frame(col1 = c(1,4,5,7,9), col2 = c(1:5), col3 = c(1:5), col4 = c(413,413,415,415,413), col5 = 22)
df2 <- data.frame(col1 = c("a","b","c","d","e"), col2 = c(1:5),col3 = c(413,415,415,415,415),col4 = c(22,23,23,23,23))

对于df1中的每一行,我从df1中的三列获取值,并将它们与df2中的三个相应列进行比较。我使用which()在for循环中执行此操作。通常,df1中的每一行都与df2中的一行完全匹配,因此我会查找它并将df2中给定行的值打印到df1[i,]中:

for (i in 1:nrow(df1)) {
 df1$newColumn[i] <- ifelse(
  length(df2$col1[which(df1$col5[i] == df2$col4 & df1$col4[i] == df2$col3 & df1$col1[i] == df2$col2)])>0,
  as.character(df2$col1[which(df1$col5[i] == df2$col4 & df1$col4[i] == df2$col3 & df1$col1[i] == df2$col2)]),
  0)
}

因此,我的示例代码发现df1[1,]中符合df2[1,]的所有必要条件,并将df2$col1[1]分配给df1$newColumn[1]。由于这对于这种大小的数据帧来说效果很好,我使用的数据框比这个大得多,这需要永远。另外,我已经了解到如果你在for循环中这样做,在R中可能有一种更有效的方式。

就像我说的那样,可能有一个直截了当的答案,但我自己无法理解。希望我以一种不仅对我有意义并且乐意阐述的方式解释我所追求的东西。非常感谢任何帮助!

更新

好吧,让我们说df1是一个长动作记录,每个观察等于一个动作,每个动作都分配一个或两个数字的数字,表示哪个人记录了动作。该号码位于df1$col1。但是,由于这些数字不是唯一的,我还必须检查此人的状态(df$col4)和部门(df$col5)。这三个因素相结合,使记录该动作的人独特。 df2然后是所有人的列表,以及其他信息,包含两位数字,状态和部门。

我想做的就是为每个行动(观察)找到在所有人员列表中记录它的人(df2),从df2$col1获取该人的姓名并将其存储在df1$newColumn

0 个答案:

没有答案