2016-09-09 12 views
1

Мне нужна помощь. У меня есть следующая таблица:R Количество строк по двум факторам

country_code=c(1,1,1,1,1,1,2,2,2,2,2,2) 
target=c('V1','V1','V2','V2','V3','V3','V1','V1','V2','V2','V3','V3') 
M1=c('X7','X7','X14','X14','X8','X8','X29','X22','X2','X22','X22','X22') 
M2=c('X1','X1','X17','X11','X21','X21','X1','X29','X8','X18','X24','X24') 
M3=c('NA','NA','NA','X1','NA','NA','NA','NA','NA','NA','NA','NA') 
CountofRun=c(1,2,1,2,1,2,1,2,1,2,1,2) 
df<-data.frame(country_code,target,M1,M2,M3,CountofRun) 

, и я хотел бы получить таблицу частот для каждого COUNTRY_CODE и целевой комбинации. Так, например, если X7 появляется во всех трех прогонах для country_code = 1 и target = V1, X7 необходимо суммировать до 3. Как вы увидите, меня интересует только подсчет количества раз каждый X1-X30 появляется в этих трех прогонах для каждой из 6 комбинаций country_code и target. Я не могу преобразовать в числовой.

Конечной стол, мы надеемся, будет выглядеть следующим образом

enter image description here

+0

есть причина не использовать 'таблицы (df ​​$ country_code, df $ target) '? – jakub

+0

Привет, Стивен и спасибо, что нашли время. Я попытался data.table и простой aggregate() summary() и даже попытался использовать compare() из другого пакета. Я считаю, что решение может быть связано с dplyr или версией приложения, но я потерян. –

+0

@jakub Этот код не дает выход для меня. Фактически необходимая мне информация удаляется из вывода этого кода. Мне нужно подсчитать, сколько раз каждый из X1-X30 появляется для каждой комбинации country_code и target. –

ответ

1

Может

library(dplyr) 
library(tidyr) 

df %>% 
    select(-CountofRun) %>% 
    gather(key, value, -(country_code:target)) %>% 
    select(-key) %>% 
    ftable(xtabs(~ country_code + target + value, data = .)) 

Что дает:

#     value NA X1 X11 X14 X17 X18 X2 X21 X22 X24 X29 X7 X8 
#country_code target              
#1   V1   2 2 0 0 0 0 0 0 0 0 0 2 0 
#    V2   1 1 1 2 1 0 0 0 0 0 0 0 0 
#    V3   2 0 0 0 0 0 0 2 0 0 0 0 2 
#2   V1   2 1 0 0 0 0 0 0 1 0 2 0 0 
#    V2   2 0 0 0 0 1 1 0 1 0 0 0 1 
#    V3   2 0 0 0 0 0 0 0 2 2 0 0 0 
+0

Это потрясающе. Это работает. Единственное, что мне нужно сделать, это присвоить его имени и экспорту. –

-1

Это поможет вам часть пути там; у вас есть счетчики теперь это просто форматирование:

> library(data.table) 
> 
> country_code=c(1,1,1,1,1,1,2,2,2,2,2,2) 
> target=c('V1','V1','V2','V2','V3','V3','V1','V1','V2','V2','V3','V3') 
> M1=c('X7','X7','X14','X14','X8','X8','X29','X22','X2','X22','X22','X22') 
> M2=c('X1','X1','X17','X11','X21','X21','X1','X29','X8','X18','X24','X24') 
> M3=c('NA','NA','NA','X1','NA','NA','NA','NA','NA','NA','NA','NA') 
> CountofRun=c(1,2,1,2,1,2,1,2,1,2,1,2) 
> df<-data.table(country_code,target,M1,M2,M3,CountofRun) 
> 
> # melt the data for easier processing 
> df_m <- melt(df, id.vars = c('country_code', 'target', 'CountofRun')) 
> 
> # count 
> df_count <- df_m[, 
+    .(count = sum(CountofRun)), 
+    keyby = .(country_code, target, value) 
+    ][value != "NA"] # remove 'NA's 
>    
> df_count 
    country_code target value count 
1:   1  V1 X1  3 
2:   1  V1 X7  3 
3:   1  V2 X1  2 
4:   1  V2 X11  2 
5:   1  V2 X14  3 
6:   1  V2 X17  1 
7:   1  V3 X21  3 
8:   1  V3 X8  3 
9:   2  V1 X1  1 
10:   2  V1 X22  2 
11:   2  V1 X29  3 
12:   2  V2 X18  2 
13:   2  V2 X2  1 
14:   2  V2 X22  2 
15:   2  V2 X8  1 
16:   2  V3 X22  3 
17:   2  V3 X24  3 
> 
+0

Спасибо за это. По какой-то причине df_count не работает для меня с ошибкой «неиспользуемый аргумент (keyby =. (Country_code, target, value))». У меня загружены все библиотеки. –

1

A data.table решение (структуру, подобную dplyr + tidyr только с другим синтаксисом)

setDT(df) 
df[, .SD 
    ][, CountofRun := NULL 
    ][, melt(.SD, id.vars=c('country_code', 'target')) 
    ][, .N, .(country_code, target, value) 
    ][, dcast(.SD, country_code + target ~ value, value.var='N', fill=0) 
    ]