2016-07-15 7 views
0

Ich habe diese df:Liste reformating in R

KEGGnumber   Cor    Colors 
X1 C00095   -2.623973e-01 RED 
X2 C17714, C00044 -2.241113e-01 RED 
X3 C00033   -3.066684e-01 RED 

und möchte es als Datenrahmen zwei Spalte zu formatieren, mit jedem einzelnen KEGGnumber mit seinem Color angepasst werden. Es würde wie folgt aussehen:

KEGGnumber Colors 
C00095  RED 
C17714  RED 
C00044  RED 
C00033  RED 

Wesentliches der neue Datenrahmen nimmt die Reihen des alten Datenrahmen mit mehr als einem KEGGnumber und spaltet sie, während die gleichen Color für jede zu halten.

Antwort

1

tidyr macht dies ganz einfach:

library(tidyr) 

df %>% separate_rows(KEGGnumber) 
##   Cor Colors KEGGnumber 
## 1 -0.2623973 RED  C00095 
## 2 -0.2241113 RED  C17714 
## 3 -0.2241113 RED  C00044 
## 4 -0.3066684 RED  C00033 

die Cor Spalte abhacken, wenn Sie mögen.

Eine weniger hübsch Basis Option:

do.call(rbind, 
     Map(function(x, y){data.frame(KEGGnumber = x, Colors = y)}, 
      strsplit(as.character(df$KEGGnumber), ', '), 
      df$Colors)) 
## KEGGnumber Colors 
## 1  C00095 RED 
## 2  C17714 RED 
## 3  C00044 RED 
## 4  C00033 RED 
1

Dies kann oder kann nicht ein Duplikat sein, aber eine sehr ähnliche Frage kann hier gefunden werden: Splitting a string into new rows in R.

Eine einfache Anpassung dieses Beispiel, um Ihren Fall wäre:

library(splitstackshape) 
library(data.table) 
df2 <- as.data.frame(cSplit(as.data.frame(ls), "KEGGnumber", 
            sep = ",", direction = "long")) 

df2 
    KEGGnumber  Cor Colors 
1  c00095 -0.2623973 RED 
2  c17714 -0.2241113 RED 
3  c00044 -0.2241113 RED 
4  c00033 -0.3066684 RED