2015-11-11 3 views
2

У меня есть data.frame, который имеет следующие поля:Многосторонние Таблица частот в R

State County Race 
FL  Broward Black 
FL  Broward White 
GA  DeKalb White 
GA  Fulton Hispanic 

И так далее. Мне нужно количество для каждого race (как его собственная переменная) в уникальной комбинации State - County, и я хочу сохранить 0 и получить общее количество. Таким образом, для приведенного выше примера, я хочу получить:

State County White Black Hispanic Total 
FL  Broward 1  1  0   2 
GA  DeKalb  1  0  0   1 
GA  Fulton  0  0  1   1 

я могу получить итоговые данные по state-county используя {plyr} пакет:

count(deaths,c("State","County")) 

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

State  County  Race  Freq 
TX   Bee  Unknown  1 
TX   Bee  White  1 
TX   Bell  Black  1 
TX   Bell  Unknown  3 
TX   Bell  White  3 

Как я могу получить это в нужном формате?

+0

Я не знаю, где вы нашли эту функцию 'count', но' table' вероятно, что вы хотите. О, теперь я вижу твое упоминание о плюре. Обычная практика здесь включать 'library (plyr)' где-то в теле кода, fyi. – Frank

+0

Когда я попробовал таблицу (deaths $ State, deaths $ County, deaths $ Race), она использовала состояние как строку, а затем графство как столбец. Они должны быть рядом, и только гонка подсчитывается и добавляется в виде столбцов. –

+0

О, это сложнее. – Frank

ответ

4

С "data.table" вы можете попробовать:

library(data.table) 
dcast(as.data.table(mydf)[, count := .N, by = names(mydf)], 
     State + County ~ Race, fun = c, value.var = "count", fill = 0)[ 
     , Total := rowSums(.SD), by = .(State, County)][] 
# State County Black Hispanic White Total 
# 1: FL Broward  1  0  1  2 
# 2: GA DeKalb  0  0  1  1 
# 3: GA Fulton  0  1  0  1 

Кажется, я не могу сохранить какую-либо многословность, не создавая сначала столбец «count». Вот что я придумал, пытаясь справиться с этим прямо в dcast:

dcast(as.data.table(mydf), State + County ~ Race, 
     fun.aggregate = function(x) as.numeric(!is.na(x)), fill = 0)[ 
     , Total := rowSums(.SD), by = .(State, County)][] 
2

Мы можем использовать count из dplyr, а затем spread данные, чтобы сделать его широка:

library(dplyr) 
library(tidyr) 

dat %>% count(State, County, Race) %>% 
     spread(Race, n, fill = 0) %>% 
     mutate(total = rowSums(.[sapply(., is.numeric)])) 

Source: local data frame [3 x 6] 

    State County Black Hispanic White total 
    (fctr) (fctr) (dbl) (dbl) (dbl) (dbl) 
1  FL Broward  1  0  1  2 
2  GA DeKalb  0  0  1  1 
3  GA Fulton  0  1  0  1 
2
dt = read.table(text="State County Race 
       FL  Broward Black 
       FL  Broward White 
       GA  DeKalb White 
       GA  Fulton Hispanic", header=T) 

library(dplyr) 
library(tidyr) 

dt %>% 
    group_by(State,County) %>% 
    mutate(Total = n()) %>% 
    count(State,County,Race,Total) %>% 
    ungroup() %>% 
    spread(Race,n, fill=0) %>% 
    select(-matches("Total"), Total) 

#  State County Black Hispanic White Total 
# (fctr) (fctr) (dbl) (dbl) (dbl) (int) 
# 1  FL Broward  1  0  1  2 
# 2  GA DeKalb  0  0  1  1 
# 3  GA Fulton  0  1  0  1 
+1

Просто заметил, что он очень похож на ответ @jeremycg. Я с удовольствием удаляю ответ, если он добавит расчет «Всего». :-) – AntoniosK

+0

Я продолжал получать следующую ошибку: «Ошибка в function_list [[i]] (значение): по какой-то причине не удалось найти функцию« group_by ». Очевидно, функция работает, и я даже вручную обновил пакет. Weird. –

+0

Не знаю, почему это так. Может быть, ваша R-версия? Вы использовали 'dplyr' раньше? Можете ли вы открыть новый сеанс R в ясном рабочем пространстве и запустить этот небольшой пример? – AntoniosK

Смежные вопросы