2016-10-07 1 views
7

私はいくつかの細胞はカンマ区切りの値の文字列を含むdata.frameありますtidyr利用separate_rows

d <- data.frame(a=c(1:3), 
     b=c("name1, name2, name3", "name4", "name5, name6"), 
     c=c("name7","name8, name9", "name10")) 

を私は、それぞれの名前が独自のセルに分割され、これらの文字列を区切りにしたいです。

1度1度行った場合は簡単です。しかし、それぞれの文字列の名前の数が同じであることが必要なので、同時に "b"と "c"の両方の列に対してこれを行うことはできません。書き込みの代わりに

tidyr::separate_rows(d, b, sep=",") 
tidyr::separate_rows(d, c, sep=",") 

これを行う方法は、1行で行うことができますか。適用あり?何かのように

apply(d, 2, separate_rows(...)) 

separate_rows()関数に引数を渡す方法がわかりません。

答えて

5

パイプを使用できます。 sep = ", "が自動的に検出されます。

d %>% separate_rows(b) %>% separate_rows(c) 
# a  b  c 
# 1 1 name1 name7 
# 2 1 name2 name7 
# 3 1 name3 name7 
# 4 2 name4 name8 
# 5 2 name4 name9 
# 6 3 name5 name10 
# 7 3 name6 name10 

%>%オペレータがパッケージに含まれているtidyrバージョン0.6.0を使用


更新: @doscendodiscimusコメントを使用して、我々はfor()ループを使用し、各反復でdを再割り当てすることができます。このようにして、私たちは好きなだけ多くの列を持つことができます。列名の文字ベクトルを使用するので、標準評価版separate_rows_に切り替える必要があります。更新d

a  b  c 
1 1 name1 name7 
2 1 name2 name7 
3 1 name3 name7 
4 2 name4 name8 
5 2 name4 name9 
6 3 name5 name10 
7 3 name6 name10 
+0

一度に2つの列を使用できない理由がわかりません。 'separate_rows_'の引数は' cols'と呼ばれます。これは複数の列が可能だと思うようにしますが、データはここでは許可されません。 –

+1

はい、各行に同じ行を書き込むことはできますが、n列に対してこれを行う方法はありますか? 10個以上の列がある場合は面倒です。 cols引数に関して、両方の列を同時にインクルードすると、エラーが発生します。 – user23413

+3

@ user23413のように、 'tidyrを使いたい場合は' for(col in c( "b"、 "c"))d < - separate_rows_(d、col、sep = "、") ' –

4

を与える

cols <- c("b", "c") 
for(col in cols) { 
    d <- separate_rows_(d, col) 
} 

ここsplitstackshape::cSplitzoo::na.locfを使用して別のアプローチです。

library(splitstackshape) 
library(zoo) 

df <- cSplit(d, 1:ncol(d), "long", sep = ",") 
na.locf(df[rowSums(is.na(df)) != ncol(df),]) 
# a  b  c 
#1: 1 name1 name7 
#2: 1 name2 name7 
#3: 1 name3 name7 
#4: 2 name4 name8 
#5: 2 name4 name9 
#6: 3 name5 name10 
#7: 3 name6 name10