2017-05-23 7 views
0

SE上のよくカバーされている問題を拡張した問題があります。すなわち:rの1つの列に基づいて分割されたデータフレーム。固定幅の列はありません。

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 

何かseparateまたはstrsplitのようなソリューションであることがそれ自身の上では見えません。複数の列に値が多すぎる(NB id 3の値がid 1より大きい)という警告が表示され、Separateが失敗します。 dplyrtidyrパッケージを使用して

おかげ

答えて

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

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 
関連する問題