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

将列表中的每个元素填充到R中的特定长度,r,lapply,na,R,Lapply,Na,这里有一个简单的r问题,基本上与正确理解列表语法有关。我将一系列矩阵加载到一个列表中(在一些初步计算之后),然后我想对其进行一些基本的块平均。我的基本工作流程如下: test1[newlength] <- NA 1) 将列表中包含的每个向量舍入为一个整数,该整数对应于我感兴趣的平均块数 2) 将列表中的每个向量填充到此新长度 3) 将列表中的每个矩阵转换为一个新的矩阵,然后我将对其应用colmeans忽略NA 这个非常基本的工作流程遵循此处所示的向量的简单方法: 然而,我有一个向量列表,

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

test1[newlength] <- NA
1) 将列表中包含的每个向量舍入为一个整数,该整数对应于我感兴趣的平均块数

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

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

这个非常基本的工作流程遵循此处所示的向量的简单方法:

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

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

test1有很多方法可以解决您的问题,但我认为有两个重要的改进需要改进。第一种方法是在对lappy()的单个调用中完成所有这一切。另一个主要问题是调用中没有返回错误的函数()的实际return()值(很抱歉,在平板电脑上,很难复制和粘贴)。所以,您可以填充“x”,但您告诉函数()返回什么呢?没什么

如果我理解正确,这里有一个解决方案可以实现这两个目的:

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)
})
lappy(test1,函数(x){

newlength听起来你想要:

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

#x[y]Hi Peter,基本上是这样的,谢谢,但是在我的例子中,我注意到了奇怪的行为,当单个向量已经是整数的倍数时,我想对其进行块平均。例如,在这个例子中,使用test1和块平均2,test1$a的结果(即c(1,2,3,4))是1.5和3.0,我希望我的输出是(3+4)/2=3.5。好吧,我没有抓住要点-如果不是偶数个元素,你只想用NAs填充。我已经用大锤(见上文)修复了它;但可能有一个更优雅的解决方案。填充的更安全方法是
length(x)
# 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)
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)
})
mapply(function(x,y) {
     # x[y] <- NA # OP's proposed strategy
     length(x) <- y # Roland's better suggestion
     return(x)
     }, test1, newlength)