2013-07-23 30 views
3

这里是一个简单的r问题,它基本上与正确理解我认为的列表语法有关。我有一系列的矩阵加载到一个列表中(接下来的一些初步计算),然后我想要进行一些基本的块平均。我的基本工作流程如下:将列表中的每个元素填充到R中的特定长度

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}) 

现在我的问题。如果这些人名单外基质我通常会垫其长度为NAS如下:

test1[newlength] <- NA 

但如何做到这一点使用lappy上(或东西akin- mapply?)。我显然不是思考语法正确位置:

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) 

我会更好先留下一个列表环境?我列出的原因是我有一个大的数据集,使用列表似乎是一个更优雅的方法。然而,我接受建议和更合理的方法。谢谢。

+3

填充的一个更安全的方法是'长度(X) < - newlength'。 – Roland

回答

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) 
}) 
+0

嗨,彼得,这基本上是谢谢,但给我的例子我注意到奇怪的行为,当个别向量已经是我想要平均的整数倍数。例如,在这个例子中,使用test1和块平均值超过2,for test1 $ a(它是c(1,2,3,4))的结果是1.5和3。0我希望我的输出是(3 + 4)/ 2 = 3.5。 – user1912925

+0

好的,我错过了一点 - 如果它不是偶数个元素,你只想填补NA。我用大锤固定了它(见上)。但可能有更优雅的解决方案。 –

+0

优雅与否你已经回答我的问题,所以谢谢。 – user1912925

4

这听起来像你想:

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