Перекрестные таблицы с данными.таблица в R [дубликат]

этот вопрос уже есть ответ здесь:

Я люблю данные.пакет таблицы в R, и я думаю, что это может помочь мне выполнить сложные задачи перекрестной табуляции, но не выяснили, как использовать пакет для выполнения задач, подобных table.

вот некоторые данные опроса репликации:

opinion <- c("gov", "market", "gov", "gov")
ID <- c("resp1", "resp2", "resp3", "resp4")
party <- c("GOP", "GOP", "democrat", "GOP")

df <- data.frame(ID, opinion, party)

в таблицах подсчет количества мнений по партиям так же прост, как table(df$opinion, df$party).

мне удалось сделать что-то похожее на сведения.таблица, но результат неуклюжий, и он добавляет отдельный столбец.

dt <- data.table(df)
dt[, .N, by="party"]

существует ряд операций группировки в данных.таблица, которая может быть отличной для быстрых и сложных перекрестных таблиц данных опроса, но я не нашел никаких учебников о том, как это сделать. Спасибо за любую помощь.

1 ответов


можно использовать dcast С data.table (см. эффективная переформовка с использованием данных.таблицы виньетка на проект wiki или страница проекта CRAN).

dcast(dt, opinion~party, value.var='ID', length)

критерии

если мы используем немного больший набор данных и сравниваем скорость с помощью dcast С reshape2 и data.table

set.seed(24)
df <- data.frame(ID=1:1e6, opinion=sample(letters, 1e6, replace=TRUE),
  party= sample(1:9, 1e6, replace=TRUE))
system.time(dcast(df, opinion ~ party, value.var='ID', length))
#   user  system elapsed 
#  0.278   0.013   0.293 
system.time(dcast(setDT(df), opinion ~ party, value.var='ID', length))
#   user  system elapsed 
# 0.022   0.000   0.023 

system.time(setDT(df)[, .N, by = .(opinion, party)])
#  user  system elapsed 
# 0.018   0.001   0.018 

третий вариант немного лучше, но он находится в "длинном" формате. Если OP хочет иметь "широкий" формат, the data.table dcast можно использовать.

примечание: Я использую версию devel, т. е. v1.9.7, но кран должен быть достаточно быстрым.