2015-10-31 6 views
6

ich einen Datenrahmen haben, die wie folgt aussieht:Erstellen einer Kreuztabelle mehrere Spalten in einem Datenrahmen in R mit

structure(list(ab = c(0, 1, 1, 1, 1, 0, 0, 0, 1, 1), bc = c(1, 
1, 1, 1, 0, 0, 0, 1, 0, 1), de = c(0, 0, 1, 1, 1, 0, 1, 1, 0, 
1), cl = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 2)), .Names = c("ab", "bc", 
"de", "cl"), row.names = c(NA, -10L), class = "data.frame") 

Die Spalte cl eine Clusterverband und die Variablen ab, bc & de tragen binäre zeigt Antworten, wobei 1 Ja und 0 bedeutet - Nr.

Ich versuche, eine Tabelle Kreuz Tabstopp-Cluster zusammen mit allen anderen Spalten im Datenrahmen viz ab, bc und de zu erstellen, wobei die Cluster Spaltenvariablen werden. Die gewünschte Ausgabe ist wie dieser

1 2 3 
ab 1 3 2 
bc 2 3 1 
de 2 3 1 

ich den folgenden Code versucht:

with(newdf, tapply(newdf[,c(3)], cl, sum)) 

Dies bietet mir Werte Quer nur eine Spalte zu einer Zeit Tabbing. Mein Datenrahmen hat mehr als 1600 Spalten mit 1 Clusterspalte. Kann jemand helfen?

+1

Es scheint, dass Sie mit 'aggregate' versuchen könnten; Aggregat (. ~ cl, newdf, sum) '? –

+0

alexis_laz ... danke für eine einfache Ausführung. Das ist wirklich nett, aber da mein aktueller Datensatz über 1600 Variablen hat, wird es ein bisschen schwierig, sie alle auf einmal zu lesen. – Apricot

Antwort

6

Ihre Daten sind in einer halben langen Halb Wide-Format, und Sie wollen es in einem voll breiten Format. Dies ist am einfachsten, wenn wir es zuerst zu einem vollständig langen Format verdeckte:

library(reshape2) 
df_long = melt(df, id.vars = "cl") 
head(df_long) 
# cl variable value 
# 1 1  ab  0 
# 2 2  ab  1 
# 3 3  ab  1 
# 4 1  ab  1 
# 5 2  ab  1 
# 6 3  ab  0 

Dann können wir es in ein breites Format drehen, mit sum als Aggregationsfunktion:

dcast(df_long, variable ~ cl, fun.aggregate = sum) 
# variable 1 2 3 
# 1  ab 1 3 2 
# 2  bc 2 3 1 
# 3  de 2 3 1 
7

Eine Möglichkeit dplyr Verwendung wäre:

library(dplyr) 
df %>% 
    #group by the varialbe cl 
    group_by(cl) %>% 
    #sum every column 
    summarize_each(funs(sum)) %>% 
    #select the three needed columns 
    select(ab, bc, de) %>% 
    #transpose the df 
    t 

Ausgang:

[,1] [,2] [,3] 
ab 1 3 2 
bc 2 3 1 
de 2 3 1 
4

In base R:

t(sapply(data[,1:3],function(x) tapply(x,data[,4],sum))) 
# 1 2 3 
#ab 1 3 2 
#bc 2 3 1 
#de 2 3 1 
2

Sie auch tidyr:gather oder reshape2::melt und xtabs kombinieren können Ihre contengency Tisch haben

library(tidyr) 
xtabs(value ~ key + cl, data = gather(df, key, value, -cl)) 
##  cl 
## key 1 2 3 
## ab 1 3 2 
## bc 2 3 1 
## de 2 3 1 

Wenn Ihr Rohr zu verwenden, bevorzugen

df %>% 
    gather(key, value, -cl) %>% 
    xtabs(value ~ key + cl, data = .) 
Verwandte Themen