2017-03-24 3 views
0

I haben folgende Daten:Wie ändere ich diese breite Tabelle in R um paarweise Vergleiche zu ermöglichen?

structure(list(id = c(174L, 187L, 188L, 190L, 213L, 234L), p7 = c(1L, 
1L, NA, 1L, 0L, 1L), p4 = c(1L, NA, NA, 1L, 1L, 1L), p3 = c(1L, 
1L, 1L, 1L, NA, 1L), p6 = c(1L, NA, NA, 1L, 1L, 1L), p1 = c(1L, 
1L, 1L, 1L, NA, 1L), p2 = c(1L, 1L, 1L, 1L, 1L, 1L), p5 = c(1L, 
0L, NA, 1L, NA, 1L), p8 = c(1L, NA, NA, 1L, 1L, 1L), q1 = c(1L, 
1L, NA, NA, NA, NA), q2 = c(NA, NA, 0L, NA, NA, NA), q3 = c(1L, 
1L, 1L, NA, 0L, 0L), q4 = c(NA, NA, NA, 0L, 0L, 0L), q5 = c(NA, 
1L, 0L, 1L, 0L, 1L), q6 = c(1L, NA, 1L, 1L, 0L, NA), q7 = c(0L, 
NA, 0L, 0L, NA, 1L), q8 = c(1L, NA, 0L, 0L, 0L, 0L)), .Names = c("id", 
"p7", "p4", "p3", "p6", "p1", "p2", "p5", "p8", "q1", "q2", "q3", 
"q4", "q5", "q6", "q7", "q8"), row.names = c(NA, 6L), class = "data.frame") 

und I einen Datenrahmen müssen, wo die erste Spalte die id wiederholt 8mal enthält, enthält die zweite Spalte alle mit p markierten Werte (in dieser Reihenfolge), und die Die dritte Spalte enthält alle mit q gekennzeichneten Werte (in dieser Reihenfolge). Ich brauche das, damit ich paarweise Vergleiche zwischen den entsprechenden Datenpunkten s und q durchführen kann.

Irgendwelche Hinweise?

Antwort

2
library(reshape2) 

df = structure(list(id=c(174L,187L,188L,190L,213L,234L),p7=c(1L, 
1L,NA,1L,0L,1L),p4=c(1L,NA,NA,1L,1L,1L),p3=c(1L, 
1L,1L,1L,NA,1L),p6=c(1L,NA,NA,1L,1L,1L),p1=c(1L, 
1L,1L,1L,NA,1L),p2=c(1L,1L,1L,1L,1L,1L),p5=c(1L, 
0L,NA,1L,NA,1L),p8=c(1L,NA,NA,1L,1L,1L),q1=c(1L, 
1L,NA,NA,NA,NA),q2=c(NA,NA,0L,NA,NA,NA),q3=c(1L, 
1L,1L,NA,0L,0L),q4=c(NA,NA,NA,0L,0L,0L),q5=c(NA, 
1L,0L,1L,0L,1L),q6=c(1L,NA,1L,1L,0L,NA),q7=c(0L, 
NA,0L,0L,NA,1L),q8=c(1L,NA,0L,0L,0L,0L)),.Names=c("id", 
"p7","p4","p3","p6","p1","p2","p5","p8","q1","q2","q3", 
"q4","q5","q6","q7","q8"),row.names=c(NA,6L),class="data.frame") 

p = melt(df, id.vars=c("id"),measure.vars=c("p7", "p4", "p3", "p6","p1", "p2", "p5", "p8"), variable.name="p") 
q = melt(df, id.vars=c("id"),measure.vars=c("q1", "q2", "q3", "q4","q5", "q6", "q7", "q8"), variable.name="q") 
both = cbind(p, q) 
+0

Es ist ein Datenrahmen, so dass Sie einfach mit ansehen könnten: Kopf (beide) –

2

Wir können dies mit melt von data.table leicht tun, die measure mehr nehmen patterns

library(data.table) 
melt(setDT(df), measure = patterns("^p\\d+", "^q\\d+"), 
        value.name = c("p", "q"), variable.name = "grp") 
Verwandte Themen