假设您有一个包含多个列的data.table,并且您对特定列下与值因子变量(在不同列上)不同的值感兴趣:
> dt <- data.table(name = c("Alice", "Alice", "Bob", "Bob", "Charlie", "Bob", "Dennis"),
+ time = c("lunch", "dinner", "lunch", "lunch", "lunch", "dinner", "dinner"),
+ meal = c("sallad", "pasta", "pasta", "pesto", "sandwich", "pizza", "pizza"))
> dt
name time meal
1: Alice lunch sallad
2: Alice dinner pasta
3: Bob lunch pasta
4: Bob lunch pesto
5: Charlie lunch sandwich
6: Bob dinner pizza
7: Dennis dinner pizza
所以在这个例子中,我是在吃了午餐但不吃晚餐,晚餐但不吃午餐的人的名字之后(所以预期的结果是查理吃午饭,丹尼斯吃晚饭)。
我尝试了group_by
和distinct
的组合,但这并不能解决这个问题,因为它给了我每个进餐时间内有不同名称的行。
> dt %>% group_by(time) %>% distinct(name)
Source: local data frame [6 x 2]
Groups: time [2]
name time
<chr> <chr>
1 Alice lunch
2 Alice dinner
3 Bob lunch
4 Charlie lunch
5 Bob dinner
6 Dennis dinner
我知道我可以根据因子变量定义两个数据子集,并在那些上调用setdiff
但是每次调用filter
几次,这有点麻烦而不是特别整洁。
有什么建议吗?
答案 0 :(得分:1)
我们可以通过分组&#39; name&#39;和if
length
的“唯一”时间&#39;元素是1,然后得到时间&#39;
dt[, if(uniqueN(time)==1) .(time = time) , name]
# name time
#1: Charlie lunch
#2: Dennis dinner
如果我们想使用tidyverse
,那么
library(dplyr)
dt %>%
group_by(name) %>%
filter(n_distinct(time)==1) %>%
select(-meal)