基于一对列值在R中的另一个df中的存在来突变df

时间:2017-08-29 17:46:29

标签: r dplyr tidyverse mutate

编辑 - 修正了Frank和ycw指出的错别字

我无法识别另一个数据框中存在的数据框中的值对。因为我的数据是长格式的,并且每列都包含多次相同的值,所以当我尝试识别匹配时,我得到的结果过于宽泛。我尝试了很多方法,无法得到我需要的确切结果。鉴于操作有多简单,我预计我会遗漏一些非常明显的东西。

对于我的例子,我有一组长格式的人员记录,df ppl。我还有针对特定时间段的另一组人员观察,在此示例中,它在某些日期缺席dfabs。我想改变ppl以创建一个新列,该列将显示人日行与df dfabs中的人日观察相匹配的时间。然而,当我尝试变异时,我仍然遇到问题,因为我不清楚如何一次基于两列进行子集化。

以下示例:

name <- c("Bob", "Bob", "Ana","Ana", "Jorge","Jorge")
day <- c(1,2,1,2,1,2)
eval <- c(4,3,5,5,2,5)
ppl <- as.data.frame(cbind(name,day, eval), names=TRUE)

   name day eval
1   Bob   1    4
2   Bob   2    3
3   Ana   1    5
4   Ana   2    5
5 Jorge   1    2
6 Jorge   2    5

nameabs <- c("Bob","Jorge","Cindy")
dayabs <- c(1,2,1)
dfabs <- as.data.frame(cbind(nameabs, dayabs), names=TRUE)
dfabs

  nameabs dayabs
1     Bob      1
2   Jorge      2
3   Cindy      1

我想看到的结果是:

    name day eval absent
1   Bob   1    4      1
2   Bob   2    3      0
3   Ana   1    5      0
4   Ana   2    5      0
5 Jorge   1    2      0
6 Jorge   2    5      1

为此,我尝试使用mutate函数:

mutate(ppl, absent = ifelse(((name %in% dfabs$nameabs) & (day %in% dfabs$dayabs)),1,0))

结果:

   name day eval absent
1   Bob   1    4      1
2   Bob   2    3      1
3   Ana   1    5      0
4   Ana   2    5      0
5 Jorge   1    2      1
6 Jorge   2    5      1

这是不对的。它列出了Bob和Jorge两天都缺席的情况。似乎在我的ifelse()语句中,它在不同的行上计算了两个逻辑表达式(name %in% dfabs$nameabs)(day %in% dfabs$dayabs)

使用filter()等其他功能给我带来了同样的问题。我无法弄清楚如何使它在一行上评估整个表达式。一般来说,无论有没有dplyr,我在这个一般性问题上遇到了很多麻烦:如何根据一对(跨两列)在另一个df中存在一个df?我正在处理一个更大,更复杂的数据集,并且有一个通用的答案会非常有用。

提前感谢您的帮助!

0 个答案:

没有答案