2017-05-23 53 views
0

我有一個問題是SE上一個覆蓋範圍很廣的問題的擴展。即:基於r列中的一列拆分數據幀,使用非固定寬度的列

Split a column of a data frame to multiple columns

我的數據具有與字符串格式,逗號分隔的一列,但不固定長度。

data = data.frame(id = c(1,2,3), treatments = c("1,2,3", "2,3", "8,9,1,2,4")) 

所以我希望有我的數據幀最終會在適當的整理/長型:

id treatments 
1  1 
1  2 
1  3 
... 
3  1 
3  2 
3  4 

喜歡的東西separatestrsplit似乎並不在它自己的是解決方案。單獨失敗,並顯示警告:各個列的值太多(NB id 3的值比ID爲1的值多)。

感謝

回答

2

您可以使用tidyr::separate_rows

library(tidyr) 
separate_rows(data, treatments) 

# id treatments 
#1 1   1 
#2 1   2 
#3 1   3 
#4 2   2 
#5 2   3 
#6 3   8 
#7 3   9 
#8 3   1 
#9 3   2 
#10 3   4 
+1

太棒了!感謝這@Psidom –

0

使用dplyrtidyr包:

data %>% 
    separate(treatments, paste0("v", 1:5)) %>% 
    gather(var, treatments, -id) %>% 
    na.exclude %>% 
    select(id, treatments) %>% 
    arrange(id) 


    id treatments 
1 1   1 
2 1   2 
3 1   3 
4 2   2 
5 2   3 
6 3   8 
7 3   9 
8 3   1 
9 3   2 
10 3   4 
0

您還可以使用unnest

library(tidyverse) 
data %>% 
    mutate(treatments = stringr::str_split(treatments, ",")) %>% 
    unnest() 

    id treatments 
1 1   1 
2 1   2 
3 1   3 
4 2   2 
5 2   3 
6 3   8 
7 3   9 
8 3   1 
9 3   2 
10 3   4