2013-06-17 4 views
3

У меня есть матрица «а», как следующее:Расширить столбцы матрицы в R

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" 

Я хочу, чтобы получить матрицу «Ъ», как этот

 [,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" 

OK, чтобы получить это:

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

Не стесняйтесь публиковать свое решение в качестве ответа и принимать его. – Julius

+1

'do.call' почти как магия :-). Хорошая работа. –

ответ

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){...}), но некоторые люди считают его более «элегантным» без какого-либо.

Смежные вопросы