将列表中的每个元素填充到R中的特定长度

时间:2013-07-23 07:51:49

标签: r lapply na

这是一个简单的问题,基本上与我认为正确理解列表语法有关。我将一系列矩阵加载到一个列表中(经过一些初步计算),然后我想进行一些基本的块平均。我的基本工作流程如下:

1)将列表中包含的每个向量四舍五入到与我有意平均到的块数相对应的整数。

2)将列表中的每个向量填充到这个新长度。

3)将列表中的每个矩阵转换为新矩阵,然后我将应用colmeans忽略NA。

这个非常基本的工作流程遵循此处显示的矢量简单方法:http://www.cookbook-r.com/Manipulating_data/Averaging_a_sequence_in_blocks/

但是我有一个向量列表而不仅仅是一个向量。例如,对于两个块:

test1 <- list(a=c(1,2,3,4), b=c(2,4,6,8,10), c=c(3,6))
# Round up the length of vector the to the nearest 2
newlength <-  lapply(test1, function(x) {ceiling(length(x)/2)*2})

现在我的问题。如果这些是列表之外的矩阵,我通常会用NA填充其长度,如下所示:

test1[newlength] <- NA

但是如何使用lappy(或类似的东西?)来做到这一点。我显然没有在这里正确考虑语法:

lapply(test1, function(x) {x[newlength] <- NA})

这显然会返回错误:

Error in x[newlength] <- NA : invalid subscript type 'list'

因为列表的语法不正确。那我该如何正确地做到这一点?

只是为了完成这个过程以防万一有一个更好的方法在最后这样做我通常会对矢量执行以下操作:

# Convert to a matrix with 2 rows
test1 <- matrix(test1, nrow=2)
# Take the means of the columns, and ignore any NA's
colMeans(test1, na.rm=TRUE)

首先离开列表环境会更好吗?我列表的原因是我有一个大型数据集,使用列表似乎是一种更优雅的方法。不过,我对建议和更合乎逻辑的方法持开放态度。感谢。

2 个答案:

答案 0 :(得分:4)

这听起来像你想要的:

mapply(function(x,y) {
     # x[y] <- NA # OP's proposed strategy
     length(x) <- y # Roland's better suggestion
     return(x)
     }, test1, newlength)

答案 1 :(得分:2)

有很多方法可以解决您的问题,但我认为有两个重要的改进。第一个是通过一次调用lapply()完成所有这些操作。你遇到的另一个主要问题是你的调用中函数()没有返回错误的实际return()值(抱歉,在平板电脑上,难以复制和粘贴)。所以你填写“x”确定,但是你告诉function()返回什么?什么都没有。

如果我理解正确的话,这是一个解决这两件事的解决方案:

lapply(test1, function(x){
  newlength <- ceiling(length(x)/2)*2
  if(newlength!=length(x)){x[newlength] <- NA}
  colMeans(matrix(x, nrow=2), na.rm=TRUE)
})