3

次のような行列「a」があります。

a<-rbind(c("a1","ost1;ost2;ost3","utr;body;pro"),
      c("a2","idh1;idh2","pro;body"),
      c("a3","dnm1","body"))
>a
     [,1] [,2]             [,3]          
[1,] "a1" "ost1;ost2;ost3" "utr;body;pro"
[2,] "a2" "idh1;idh2"      "pro;body"    
[3,] "a3" "dnm1"           "body"  

このような行列「b」を取得したい

     [,1] [,2]   [,3]  
[1,] "a1" "ost1" "utr" 
[2,] "a1" "ost2" "body"
[3,] "a1" "ost3" "pro" 
[4,] "a2" "idh1" "pro" 
[5,] "a2" "idh2" "body"
[6,] "a3" "dnm1" "body"

わかりました、それを手に入れてください:

b<-do.call(rbind, (apply(a, 1, function(x) {do.call(cbind, strsplit(x,";"))})))
4

1 に答える 1

1

不要な括弧なしのソリューション:

do.call(rbind, apply(a, 1, function(x) do.call(cbind, strsplit(x, ";"))))

これも機能します:

do.call(rbind, lapply(apply(a, 1, strsplit, ';'), do.call, what = cbind))

匿名関数 ( ) を使用することに問題があるわけではありませんが、匿名関数を使用しfunction(x){...}ないほうが「エレガント」と感じる人もいます。

于 2013-06-17T23:23:55.597 に答える