编辑 - 修正了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?我正在处理一个更大,更复杂的数据集,并且有一个通用的答案会非常有用。
提前感谢您的帮助!