迭代数据框中的列,取其平均值并将其与同一列中的每个值进行比较

时间:2018-01-18 11:08:39

标签: r function data-manipulation

我需要编写一个简单的函数,首先迭代数据框中的每一列,取其平均值,然后遍历该列中的每一行,获取其值并与对应于来自该列的追溯日期的值进行比较。同一列(-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列。

1 个答案:

答案 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,因为没有可用于第二个条件的比较值。