【问题标题】:Iterate through columns in data frame taking its average and comparing it with every value within the same column遍历数据框中的列,取其平均值并将其与同一列中的每个值进行比较
【发布时间】:2018-06-27 10:35:09
【问题描述】:

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

【问题讨论】:

    标签: r function data-manipulation


    【解决方案1】:

    应该这样做。您需要 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,因为没有可用于第二个条件的比较值。

    【讨论】:

    • 我想我应该更加熟悉apply家族。谢谢!
    • apply 家庭非常有帮助。还有,列表。他们很棒,别让任何人告诉你。
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 2019-07-23
    • 2021-02-22
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多