Почему функция группировки в цикле for не работает?

#r

Вопрос:

По какой-то причине термин i в цикле for не может использоваться в качестве имени группы. У меня есть 40 элементов в цикле for. Я показываю здесь только 2 в качестве примера.

 data = data.table(id = c(1,1,1,1,1), a = c(1,1,2,3,NA), b = c(1,2,2,NA,3))

> data
   id  a  b
1:  1  1  1
2:  1  1  2
3:  1  2  2
4:  1  3 NA
5:  1 NA  3

categories = data.table(CATEGORY = c(1,2,3,NA))

> categories
   CATEGORY
1:        1
2:        2
3:        3
4:       NA
 

Что я сделал:

 for (i in colnames(data)[2:3]){
  
  dt = data[, .N, i][order(i)]
  setnames(dt, "N", i)
  
  categories = cbind(categories, dt[,2])
}

> categories
   CATEGORY a b
1:        1 2 1
2:        2 2 1
3:        3 2 1
4:       NA 2 1
 

Я также попробовал трубопровод dplyr вместо data.table .N и это не сработало:

 data %>% count(i)
 

Что мне нужно:

 > categories
   CATEGORY a b
1:        1 2 1
2:        2 1 2
3:        3 1 1
4:       NA 1 1
 

Комментарии:

1. Причина , по которой ваш цикл не работает, заключается в том, что R использует ленивую оценку . выражения вычисляются только при необходимости. Вы не ссылаетесь categories , пока цикл не будет выполнен. На данный момент i счетчик циклов 3 равен . Тем не менее, комментарий @RonakShah о преобразовании данных верен: аккуратность важна концептуально, но также будет иметь практическое преимущество, поскольку облегчит вашу жизнь и сделает ваш код более надежным.

Ответ №1:

Вместо этого вы могли бы изменить данные, что облегчило бы их вычисление.

В data.table :

 library(data.table)

long_data <- melt(data, 'id')
dcast(long_data[, .N, .(variable, value)], value~variable, value.var = 'N')

#   value a b
#1:    NA 1 1
#2:     1 2 1
#3:     2 1 2
#4:     3 1 1
 

Или в tidyverse :

 library(dplyr)
library(tidyr)

data %>%
  pivot_longer(cols = -id) %>%
  count(name, value) %>%
  pivot_wider(names_from = name, values_from = n)
 

Комментарии:

1. Привет, Ронак, спасибо за предложение, в обратном порядке я получил такую ошибку: Ошибка: Внутренняя ошибка в compact_rep() : Отрицательный n вход compact_rep() . Запустите rlang::last_error() , чтобы узнать, где произошла ошибка. возможно, мне нужно упомянуть, что есть еще одна переменная под названием «дата», которая превращает это в набор данных панели.

2. @JantjeHouten Эта data.table версия сработала для вас? Я не получаю такой ошибки для tidyverse набора данных, которым вы поделились. У вас, наверное, есть plyr заряженные? Попробуйте использовать dplyr::count явно в коде.

3. У меня также нет проблем с запуском стиля tidyverse в этом образце набора данных. В моем фактическом наборе данных на самом деле есть еще один столбец «дата», который превращает это в набор данных панели. Я удалил этот столбец даты и последовал коду, но получил ошибку.

4. @JantjeHouten Можете ли вы предоставить набор данных, который ближе к вашему фактическому набору данных, чтобы мы могли воспроизвести ошибку?

5. Спасибо за помощь, Ронак, позволь мне обновить это через несколько часов. Спасибо!