我在这里有一个关于for循环中print()
的问题。
我有一个包含2列的数据集(gpa
)。我试图获得两列内的值的均值,方差和标准差。当我编码时,
for(x in c(1:2)) {
mean(gpa[[x]])
var(gpa[[x]])
sd(gpa[[x]])
}
我没有得到任何输出:
for(x in c(1:2)) {
print(mean(gpa[[x]]))
print(var(gpa[[x]]))
print(sd(gpa[[x]]))
}
但如果我在每行之前插入print,我会得到所需的值。 这有什么区别?印刷真的有必要吗?
答案 0 :(得分:1)
这样做的原因是,循环中的所有内容都会被评估,但永远不会返回到某个地方。虽然print提供的东西我不建议,因为你以后不能使用这些值,因为它们会返回到控制台而不是全局环境。相反,你可能想要将它们分配给某些东西。 例如:
#example data
df <- data.frame(x = 1:10, y = rnorm(10))
#it is good to create the output in the desired length first
#it is much more efficient in terms of speed an memory beeing used but here it don't really matter
ret <- vector("list", NCOL(df))
for(x in seq_len(NCOL(df))){
ret[[x]] <- c(mean(df[[x]]),
var(df[[x]]),
sd(df[[x]]))
}
ret
虽然我也没有建议。对于大多数(如果不是全部的话)你可以使用for循环,你可以使用base r中的apply系列函数或purrr的map函数。这看起来就是这样:
library(purrr)
map(df, ~c(mean(.), var(.), sd(.)))
#or even save it with names
ret <- map(df, ~c(mean = mean(.), var = var(.), sd = sd(.)))
ret
应用/地图变体更快&amp;更短,但更重要的是让我更容易理解并且错误的空间更小。虽然还有一堆其他论据,但为什么你可能想要使用apply / map。