如何在data.table中的因子变量的不同级别之间获取不同的值

时间:2017-03-21 12:30:08

标签: r data.table dplyr

假设您有一个包含多个列的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_bydistinct的组合,但这并不能解决这个问题,因为它给了我每个进餐时间内有不同名称的行。

> 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几次,这有点麻烦而不是特别整洁。

有什么建议吗?

1 个答案:

答案 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)