我需要编写一个简单的函数,首先迭代数据框中的每一列,获取其平均值,然后迭代该列中的每一行,获取其值并与对应于追溯日期的值进行比较同一列(-2 天)以及列平均值,如果值 > 平均值和回顾值,则返回“一切正常”;如果值 < 平均值和回顾值,则返回“异常”。
这是我的数据框:
df <- data.frame(startdate = as.Date('2010-11-1') + 0:4,
salary = c(21000, 23400, 26800, 40586, 86750),
bonus = c(350, 400, 170, 180, 95))
看起来像这样:
startdate salary bonus
1 2010-11-01 21000 350
2 2010-11-02 23400 400
3 2010-11-03 26800 170
4 2010-11-04 40586 180
5 2010-11-05 86750 95
当然,我已经尝试了不同的方法来解决这个问题,但我现在想到的只是创建一个函数,该函数将数据框和列名作为参数并完成这项工作。
如何让它遍历数据框中的所有列并返回所需的输出?
假设日期已排序(升序)并且没有任何重复项。在原始数据集中,我有 30 行和大约 14 列。
最佳答案
这应该可以做到。您将需要 dplyr
包才能正常工作,因为它使用 lag()
函数:
FOO <- function(df){
# calculate colmeans
means <- sapply(df, mean)
# generate matrix with value 2 if both conditions are TRUE
output <- as.data.frame((df > means) + (df > sapply(df, dplyr::lag, 2)))
# insert string values
output[output < 2] <- "Anomaly"
output[output == 2] <- "All okay"
return(output)
}
> FOO(df)
startdate salary bonus
1 <NA> <NA> <NA>
2 <NA> <NA> <NA>
3 All okay Anomaly Anomaly
4 All okay All okay Anomaly
5 Anomaly All okay Anomaly
对于前两行,它将返回 NA
,因为第二个条件没有可用的比较值。
关于r - 迭代数据框中的列,取平均值并将其与同一列中的每个值进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48319863/