R apply Return子矩阵

时间:2015-01-26 05:35:37

标签: r matrix syntax apply

鉴于此代码:

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

1 个答案:

答案 0 :(得分: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'        如果'n>返回维度'c(n,dim(X)[MARGIN])'的数组1。        如果'n'等于'1','apply'如果'MARGIN'有长度则返回一个向量        1和另一个维度'dim(X)[MARGIN]'的数组。如果'n'是        '0',结果长度为0但不一定是'正确'        尺寸。   如果调用'FUN'返回不同长度的向量,'apply'        返回一个长度为'prod(dim(X)[MARGIN])'的列表,其中'dim'设置为        如果长度大于1,则为“MARGIN”。