R计算列表中的数据帧行:for循环的行为与apply不同?

时间:2015-05-22 15:29:51

标签: r dataframe

因此,我在编写便利函数时遇到了一个非常奇怪的问题,即计算数据帧列表中每个数据帧的行数。我认为必须有一些我缺失的基本行为,比如对列表进行索引并不像我认为的那样工作,或者某些东西被强制转换为错误类型的变量或其他东西。有人可以帮助兄弟吗?

可重复的例子:

myvec <- c(1,2,3,4,5)
df1 <- as.data.frame(rbind(myvec, myvec))
df2 <- as.data.frame(rbind(myvec, myvec, myvec))
dflist <- list(df1, df2)
nrow(dflist[[1]])
# output as expected: [1] 2
nrow(dflist[[2]])
# output as expected: [1] 3

# convenience function 

countrows <- function(pglist) {
  dfsizes <- rep(NA, length(pglist))
  for (i in length(pglist)) {
    dfsizes[i] <- nrow(pglist[[i]])
    return(dfsizes)
  }  
}

newvector <- countrows(dflist)
newvector

# output totally not as expected: [1] NA  3

我必须在这里遗漏一些明显的东西。

是的,我知道这可以通过lapply(dflist, nrow)完美地完成,而且实际上确实产生了正确的输出。但显然我不知道如何正确地循环列表中的元素,这是一个完全不同的问题,除了有一种更简单的方法来做我想要实现的目标......

编辑:一位善意的评论者指出我在for循环中有一个return语句,oops。但是,纠正仍会产生相同的错误输出:

countrows2 <- function(pglist) {
  dfsizes <- rep(NA, length(pglist))
  for (i in length(pglist)) {
    dfsizes[i] <- nrow(pglist[[i]])
  }  
  return(dfsizes)
}

doom <- countrows2(dflist)
doom
# still bad output: [1] NA  3

第二次编辑:我很难避免愚蠢的语法错误,比如忘记在1开始循环。双重呐喊。请参阅Neal Fultz的评论,他在避免愚蠢的语法错误方面比我差。

1 个答案:

答案 0 :(得分:0)

你的代码有一个问题,它需要是1:length(pglist)而不仅仅是for()部分的长度(pglist)。你只用了长度(pglist)为我循环。还需要将循环表达式从循环中取出。

countrows <- function(pglist) {
  dfsizes <- rep(NA, length(pglist))
  for (i in 1:length(pglist)) {
    dfsizes[i] <- nrow(pglist[[i]])
  }  
  return(dfsizes)
}

newvector <- countrows(dflist)
newvector

这应该按预期工作。干杯

编辑:我暂时不能发表评论