2015-01-26 3 views
1

Учитывая этот код:R применять Return подматрица

test=matrix(c(1,2,3,4,5,6,7,8,9,10,11,12),4) 
splitData=data.frame(first=c(1,3),second=c(2,4)) 
apply(splitData,1,function (x) {test[x[1]:x[2],]}) 

Я получаю эту матрицу:

 [,1] [,2] 
[1,] 1 3 
[2,] 2 4 
[3,] 5 7 
[4,] 6 8 
[5,] 9 11 
[6,] 10 12 

Почему я не получаю список матриц?

Предназначенный результат:

[[1]] 
    [,1] [,2] [,3] 
[1,] 1 5 9 
[2,] 2 6 10 

[[2]] 
    [,1] [,2] [,3] 
[1,] 3 7 11 
[2,] 4 8 12 
+0

Действительно, это действительно работает, как и литье матрицы в качестве фрейма данных, но почему это не мое? – Carbon

ответ

2

Вы можете попробовать

do.call(`c`,apply(splitData, 1, function(x) list(test[x,]))) 

Или

lapply(seq_len(nrow(splitData)), function(i) test[unlist(splitData[i,]),]) 

От ?apply

Если каждый вызов «FUN» возвращает вектор длины «n», тогда «apply» возвращает массив измерения «c (n, dim (X) [MARGIN])», если «n> 1». Если 'n' equals '1', 'apply' возвращает вектор, если 'MARGIN' имеет длину 1 и массив измерения dim (X) [MARGIN] 'в противном случае. Если 'n' равно '0', результат имеет длину 0, но не обязательно «правильное» измерение . Если вызовы «FUN» возвращают векторы разной длины, «apply» возвращает список длины «prod (dim (X) [MARGIN])» с «dim», установленным на «MARGIN», если это имеет длину больше чем один.

+0

Я хотел бы знать, почему мой не работает - это больше вопрос понимания языка, чем поиск обходного пути. – Carbon

+0

Из '' apply'. «Применить» попытки принудить его к массиву через «as.matrix», если он двумерный (например, данные ) или через «as.array». – akrun

+0

Это будет работать. Благодарю. – Carbon

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