2016-07-15 2 views
0

У меня есть эта ДФ:Список переформатирование в R

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

и хотели бы отформатировать его как два столбца dataframe с каждым отдельным KEGGnumber в быть согласованы с Color. Это будет выглядеть примерно так:

KEGGnumber Colors 
C00095  RED 
C17714  RED 
C00044  RED 
C00033  RED 

По сути, новый dataframe взять строки старой dataframe с более чем одним KEGGnumber и разбивает их, сохраняя при этом тот же Color для каждого.

ответ

1

tidyr делает это довольно легко:

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 

отрубить Cor столбец, если вам нравится.

Менее довольно вариант базы:

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

Это может быть или не быть дубликатом, но очень похожий вопрос можно найти здесь: Splitting a string into new rows in R.

Простая адаптация данного примера в вашем случае будет:

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 
Смежные вопросы