因此,我在编写便利函数时遇到了一个非常奇怪的问题,即计算数据帧列表中每个数据帧的行数。我认为必须有一些我缺失的基本行为,比如对列表进行索引并不像我认为的那样工作,或者某些东西被强制转换为错误类型的变量或其他东西。有人可以帮助兄弟吗?
可重复的例子:
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的评论,他在避免愚蠢的语法错误方面比我差。
答案 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
这应该按预期工作。干杯
编辑:我暂时不能发表评论