我根据不同的情况编了一些数据,abe 有两次苹果,chris 在第三键有苹果,ethan 没有苹果。使用此解决方案,如果不匹配,则删除名称。
library(tidyverse)
my_df<-data.frame(name=c("abe", "ben", "chris", "doug", "ethan"),
key1=c("apple", "apple", "banana", "apple", "orange"),
key2=c("apple", NA, "orange", NA, NA),
key3=c(NA, NA, "apple", NA, NA),
stringsAsFactors = FALSE)
my_df %>% gather("key", "tag", -name) %>% group_by(name) %>% filter(tag=="apple") %>% tally()
数据
> my_df
name key1 key2 key3
1 abe apple apple <NA>
2 ben apple <NA> <NA>
3 chris banana orange apple
4 doug apple <NA> <NA>
5 ethan orange <NA> <NA>
输出
name n
1 abe 2
2 ben 1
3 chris 1
4 doug 1
对于您的独特情况,您可能需要探索gather() 函数的工作原理,并可能使用select() 来选择特定列。如果您是 tidyverse 管道的新手,我建议您从运行第一个管道开始,并检查每个短语如何修改数据帧(例如,my_df %>% gather("key", "tag", -name))。
编辑;可以使用 count 函数的内置分组来简化:
my_df%>%gather("key", "tag", -name)%>%filter(tag=="apple")%>%count(name)