按R中的其他变量分组时,查找每组具有多个唯一值的列

时间:2020-03-29 19:20:50

标签: r group-by datatable grouping categorical-data

例如,我有一个数据集(我的真实数据集有数百列和数百万个观测值):

> data
    time_period country      var1   var2 var3
 1:     2000_Q2     USA     april spring  ABS
 2:     2000_Q2     USA       may spring  CND
 3:     2000_Q3     USA      june summer  ABS
 4:     2005_Q2   Italy     april spring  ABS
 5:     2010_Q2   Italy       may spring  ABS
 6:     2010_Q2   Italy       may spring  ABS
 7:     2012_Q2   Italy       may spring  ABS
 8:     2018_Q4   China   october autumn  ABS
 9:     2018_Q4   China september autumn  ARF
10:     2018_Q4   China   october autumn  ABS
11:     2018_Q4   China   october autumn  ABS
12:     2000_Q2     USA     march spring  ABS

我需要按datatime_periodcountry进行分组,并找到每组具有至少1个唯一值的所有变量(至少对于一组)。在我的数据集中,所有这些变量都属于chr类型。
我是通过以下方式做到的:

colnames_to_group = c("time_period", "country", "var1", "var2", "var3")
data_count = data[, lapply(.SD, uniqueN), 
                  by = c("time_period", "country"), 
                  .SDcols = colnames_to_group]
> data_count
   time_period country time_period country var1 var2 var3
1:     2000_Q2     USA           1       1    3    1    2
2:     2000_Q3     USA           1       1    1    1    1
3:     2005_Q2   Italy           1       1    1    1    1
4:     2010_Q2   Italy           1       1    1    1    1
5:     2012_Q2   Italy           1       1    1    1    1
6:     2018_Q4   China           1       1    2    1    2

tokeep <- which(sapply(data_count, is.numeric))
multiple_values <- sapply(data_count[ , tokeep, with = FALSE], function(x) any(x > 1))

> multiple_values
time_period     country        var1        var2        var3 
      FALSE       FALSE        TRUE       FALSE        TRUE 

colnames_with_multiple_values <<- names(multiple_values[(multiple_values == TRUE)]) 

> colnames_with_multiple_values
[1] "var1" "var3"

这可行,这就是我想要的。但是对于庞大的数据集,这种方法可以使用很长时间。
有什么方法可以更好地实现这一目标吗?
感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

对于非常大的向量,uniqueN()更快。
但是,当我的任务中有许多子组并且uniqueN()应该被调用数百万次时,性能的下降非常明显。
在这种情况下,最好使用n_distinct中的dplyr函数。

Unit: seconds
       expr       min        lq      mean    median        uq       max neval
 data_table 16.692984 16.692984 16.692984 16.692984 16.692984 16.692984     1
      dplyr  3.506646  3.506646  3.506646  3.506646  3.506646  3.506646     1