Найти столбцы с несколькими уникальными значениями на группу при группировании по другим переменным в R - PullRequest
1 голос
/ 29 марта 2020

Например, у меня есть набор данных (мой реальный набор данных содержит сотни столбцов и миллионы наблюдений):

> 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"

Это работает, и это то, что я хочу получить. Но для огромных наборов данных это работает очень долго. Есть ли способы реализовать это более оптимально? Спасибо за любую помощь!

1 Ответ

1 голос
/ 30 марта 2020

Для очень больших векторов 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...