我需要编写一个简单的函数,首先迭代数据框中的每一列,取其平均值,然后遍历该列中的每一行,获取其值并与对应于来自该列的追溯日期的值进行比较。同一列(-2天)以及列平均值,如果值>&gt;则返回“全部好”平均值和回顾性值和“异常”,如果值<1。平均值和回顾价值。
这是我的数据框:
cropMaxCharacters
看起来像这样:
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))
当然,我尝试过不同的方法来解决这个问题,但我现在提出的所有方法都是创建一个函数,它将数据框和列名作为参数并完成工作。
如何让它通过数据框中的所有列并返回所需的输出?
假设日期是有序的(升序)并且没有任何重复。在原始数据集中,我有30行和大约14列。
答案 0 :(得分:2)
这应该这样做。您需要包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
,因为没有可用于第二个条件的比较值。