例如,我有一个数据集(我的真实数据集有数百列和数百万个观测值):
> 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
我需要按data
和time_period
对country
进行分组,并找到每组具有至少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"
这可行,这就是我想要的。但是对于庞大的数据集,这种方法可以使用很长时间。
有什么方法可以更好地实现这一目标吗?
感谢您的帮助!
答案 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