【发布时间】:2021-04-30 13:33:38
【问题描述】:
我有一个这样的数据框:
df <- data.frame(A=1:10, B=3, C=17)
我想对数据帧的每一行应用一个函数,该函数根据行的值迭代计算一个值。我的原始数据和我使用的函数要复杂得多,但这里的结构和问题是一样的。
例如,我使用下面的函数来迭代计算 A 的平方根:
fun_iter <- function(df_input, diff=10){
sqrt_iter <- df_input["A"]
while(diff>0.01) {
sqrt_iter_new <- (sqrt_iter + df_input["A"] / sqrt_iter) / 2 # approximate the square-root
diff <- abs(sqrt_iter - sqrt_iter_new) # difference between the iteration steps
sqrt_iter <- sqrt_iter_new # overwrite old value with new iteration
}
sqrt_iter[[1]]
}
然后我可以得到一行的计算值:
fun_iter(df[3, ])
它正确返回了 3 的平方根。此外,我可以使用这样的 for 循环遍历数据帧:
for (i in 1:nrow(df)) {
print(fun_iter(df[i, ]))
}
这给了我“A”列中所有值的平方根。但是,由于我有一个相当大的数据框,我想使用“应用”或“映射”或类似有效的方式来获取输出,但它总是返回这个错误:
apply(df, 2, fun_iter)
Error in while (diff > 0.01) { : Missing Value, where TRUE/FALSE is needed
因此,apply 似乎在评估函数内的“while”条件时遇到了问题。 “map”、“mapply”、“do.call”也是如此。非常感谢任何解决此问题的提示。
【问题讨论】:
-
apply只是变相的循环。它不会为您提供与矢量化相同的速度提升(假设矢量化是可能的)。即使你得到了正确的细节,你也可能会对结果感到失望。 -
试试这个 apply(df, 1, fun_iter)
-
它有效,谢谢!尽管使用了多年,但我似乎对 apply 中的“1”和“2”的方向感到困惑。可能与下面答案中描述的输入格式有关。谢谢!
-
@John Coleman 谢谢,不幸的是,矢量化是不可能的。我更喜欢
apply而不是 for 循环,这样我就不必处理将每个迭代步骤写入预定义的数据帧
标签: r while-loop apply