#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. Спасибо за помощь, Ронак, позволь мне обновить это через несколько часов. Спасибо!