2016-05-08 7 views
-1

zu erweitern Ich habe ein Datenframe namens mydf. Ich möchte diesen Datenrahmen so erweitern, dass ich paarweise Kombination von Proben für alle Spaltenwerte getrennt durch bekommen „:“ und erhalten das Ergebnis wie folgt:Wie die Spaltenwerte (paarweise) zu erweitern, um den Datenrahmen in R

mydf<-structure(list(Sample = c("1749742002_A", "1749742086_A", "1749742184_A" 
), Call.Rate = c(0.9995, 0.9992, 0.999), Study = c(133, 133, 
133), Ethnicity = c("Adygei", "Maya", "Adygei")), .Names = c("Sample", 
"Call.Rate", "Study", "Ethnicity"), row.names = c(NA, 3L), class = "data.frame") 

Ergebnis

Sample       Call.Rate  Study  Ethnicity 
1749742002_A:1749742086_A 0.9995:0.9992 133:133 Adygei:Maya 
1749742086_A:1749742002_A 0.9992:0.9995 133:133 Maya:Adygei 
1749742086_A:1749742184_A 0.9992:0.9990 133:133 Maya:Adygei 
1749742184_A:1749742002_A 0.9990:0.9995 133:133 Adygei:Adygei 

und so weiter ..

+1

so 3 wählen 2 4 jetzt ist? – rawr

+1

Benötigen Sie 'data.frame (lapply (mydf, function (x) if (länge (unique (x))> 1) do.call (einfügen, c (expand.grid (x, x), sep =": ")) sonst einfügen (x [1], x [1], sep =": ")))' – akrun

+0

@rawr muss es 9 sein, aber ich habe die anderen 5 Zeilen nicht erwähnt (war zu faul). – MAPK

Antwort

1

Wir verwenden

data.frame(lapply(mydf, function(x) if(length(unique(x)) >1) 
     do.call(paste, c(expand.grid(x,x), sep=":")) 
     else paste(x[1], x[1], sep=":"))) 
0

Hier ist eine Version, unter Verwendung von Zwischendatenrahmen, so dass es einfacher ist, die Schritte verstehen Die letzte Art gezwickt werden müssen, wenn bestellen wichtig

ist
# slightly cleaner data creation 
mydf<-data.frame(
    Sample = c("1749742002_A", "1749742086_A", "1749742184_A"), 
    Call.Rate = c(0.9995, 0.9992, 0.999), 
    Study = c(133, 133, 133), 
    Ethnicity = c("Adygei", "Maya", "Adygei")) 

require(dplyr) 

# use dplyr::lead to create a dataframe offset by 1 row 
# and prefix the column names with "y. 
mydf_lead <- data.frame(lapply(mydf, lead)) 
names(mydf_lead) <- paste0("y.", names(mydf)) 

# cbind the original wwith the lead df     
mydf2 <- cbind(mydf, mydf_lead) %>% filter(!is.na(y.Sample)) 

# create the a:b and b:a variations as seprate data frames -- fix oclumn names 
mydf_ab <- data.frame(lapply(1:ncol(mydf), function(i) {paste(mydf2[,i], ":", mydf2[,i+ncol(mydf)])})) 
mydf_ba <- data.frame(lapply(1:ncol(mydf), function(i) {paste(mydf2[,i+ncol(mydf)], ":", mydf2[,i])})) 
names(mydf_ab) <- names(mydf_ba) <- names(mydf) 

# rbind the results, and sort 
result <- rbind(mydf_ab, mydf_ba) %>% 
    arrange(Sample) 

result 

Sample  Call.Rate  Study  Ethnicity 
1 1749742002_A : 1749742086_A 0.9995 : 0.9992 133 : 133 Adygei : Maya 
2 1749742086_A : 1749742184_A 0.9992 : 0.999 133 : 133 Maya : Adygei 
3 1749742086_A : 1749742002_A 0.9992 : 0.9995 133 : 133 Maya : Adygei 
4 1749742184_A : 1749742086_A 0.999 : 0.9992 133 : 133 Adygei : Maya 
Verwandte Themen