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

标签 r function data-manipulation

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

相关文章:

c++ - 在 C++ 中导入一个 dll 函数

javascript - 在附加的 js 文件中重新分配 javascript 函数

java - 从文本文件中删除重复行

r - 大数据集清洗: How to fill in missing data based on multiple categories and searching by row order

r Shiny 的 Action 按钮和数据表输出

html - 在 R Markdown 文件中包含 HTML 文件?

R:合并具有多个条件和多个逻辑运算符的数据帧

r - 一次累加和减法时重置的条件累加

python - 多参数值错误

python - 如何从具有条件的另一列中提取值?