2016-06-14 10 views
0

ich habe folgenden Datenrahmen originalDatawie ein Multilabel Datenrahmen in einzelne Spalt in R rollen

ID Y1 Y2 Y3 X1  X2  X3 
1 111 TRUE TRUE FALSE 12 junior 45.55 
2 112 FALSE FALSE TRUE 15 junior 458.54 
3 113 TRUE TRUE FALSE 16 senior 48.79 

Ich mag würde folgendes Ergebnis

ID YCOMBIN X1  X2  X3 
1 111  Y1 12 junior 45.55 
2 111  Y2 12 junior 45.55 
3 112  Y3 15 junior 458.54 
4 113  Y1 16 senior 48.79 
5 113  Y2 16 senior 48.79 

ich das mein Beispiel glauben, um mehr klar ist, als eine lange Erklärung. Falls nicht. Ich würde gerne alle meine Ergebnisse (in meinem Fall Y1 und Y2) in eine einzige YCOMBIN-Spalte rollen, wenn der Wert des Adhoc-Ergebnisses TRUE ist. In diesem Fall kann ich natürlich die ID und alle Prädiktoren (X1 und X2) wiederholen, wenn eine ID mehr als 1 TRUE Wert im Ergebnis hat.

Was ist der beste Weg, um das gewünschte Ergebnis zu erreichen?

Datenquelle:

originalData <- structure(list(ID = 111:113, Y1 = c(TRUE, FALSE, TRUE), Y2 = c(TRUE, 
FALSE, TRUE), Y3 = c(FALSE, TRUE, FALSE), X1 = c(12L, 15L, 16L 
), X2 = structure(c(1L, 1L, 2L), .Label = c("junior", "senior" 
), class = "factor"), X3 = c(45.55, 458.54, 48.79)), .Names = c("ID", 
"Y1", "Y2", "Y3", "X1", "X2", "X3"), class = "data.frame", row.names = c(NA, 
-3L)) 

Antwort

2

Hier sind zwei Möglichkeiten.

Mit dplyr und tidyr

library(dplyr) 
library(tidyr) 
originalData %>% 
    gather(key = "YCOMBIN", value = "value", Y1, Y2, Y3) %>% 
    filter(value) %>% 
    select(-value) 

nur verwenden dplyr

library(dplyr) 
originalData %>% 
    mutate(
    YCOMBIN = ifelse(Y1, "Y1", ifelse(Y2, "Y2", "Y3")) 
) %>% 
    select(-matches("Y[[:digit:]]")) 
+0

Hallo danke für die Antwort, ich mag die erste Lösung. Aber im wirklichen Leben sind meine Y groß und haben andere Namen. Ist es möglich, etwas wie Sammeln zu verwenden (key = "YCOMBIN", value = "value", originalData [, 2: 4]). Ich habe es versucht, aber es funktioniert nicht. – S12000

+0

In diesem Fall können Sie 'gather_' verwenden. 'gather_ (key =" YCOMBIN ", value =" value ", Namen (originalData [, 2: 4])'. – Psidom

+0

vielen Dank es hilft – S12000