【问题标题】:R average values without NA不带 NA 的 R 平均值
【发布时间】:2019-02-04 13:37:07
【问题描述】:

附件图片(链接)解释了我的问题。

我尝试了以下代码但没有结果:

df[paste0("combined_", df_of_column_names)] <- lapply(df, ave, na.rm =TRUE, df[["index Z"]]) 

在存在 NA 的情况下不返回平均值

df[paste0("combined_", df_of_column_names)] <- lapply(df, ave(FUN=function(x) mean(x, na.rm=T)), df[["index Z"]]) 

给出错误:

FUN(x) 中的错误:缺少参数“x”,没有默认值

有人可以帮我解决这个问题吗?非常感谢!

【问题讨论】:

  • 欢迎来到 SO!请添加一些不是图像的数据,以便在 R 中使用并帮助您。
  • 你受限于基础 R 吗?使用 R 库有更简单的方法。
  • 感谢@s_t 的提示

标签: r dataframe average


【解决方案1】:

使用基础 R,我能够在与您类似的简单案例上使用它。

attach(warpbreaks)
wool[5] <- NA
df <- data.frame(wool = wool, break = breaks)
df <- cbind(df, df$wool)

df
   wool breaks breaks.1
1     A     26       26
2     A     30       30
3     A     54       54
4     A     25       25
5     A     NA       NA
6     A     52       52
...

lapply(df[,-1], function(x) ave(x, df[,1], FUN = function(x) mean(x, na.rm=TRUE)))

$breaks
 [1] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
 [9] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
[17] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
[25] 29.53846 29.53846 29.53846 25.25926 25.25926 25.25926 25.25926 25.25926
[33] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926
[41] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926
[49] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926

$breaks.1
 [1] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
 [9] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
[17] 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846 29.53846
[25] 29.53846 29.53846 29.53846 25.25926 25.25926 25.25926 25.25926 25.25926
[33] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926
[41] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926
[49] 25.25926 25.25926 25.25926 25.25926 25.25926 25.25926

【讨论】:

    【解决方案2】:

    如果没有可重复的示例,很难给出相关答案,但请尝试:

    library(dplyr)
    df2 <- df %>% # df is your data frame
            group_by(`index Z`) %>% 
            summarise_all(.funs = mean, na.rm = TRUE) 
    # expected output
    left_join(df1[, 1], df2, by = `index Z`)
    

    【讨论】:

      【解决方案3】:

      与 ANG 类似的答案,但使用 data.table

      library(data.table)
      df <- setDT(df)
      df2 <- df[,lapply(.SD,mean), by = `index Z`]
      df2[df, on = `index Z`]
      

      【讨论】:

        【解决方案4】:

        使用库 dplyr。检查这个例子:

        df1 %>% group_by(index) %>%
          summarise(modreturn1 = mean(return1,na.rm = T), modreturn2 = mean(return2,na.rm = T))
        

        它将返回一个表格,将前两个变量汇总为它们的平均值(不包括NA's)。 现在,如果您真的想要与原始数据集一样多的行: 首先,将上面的查询保存到一个名为resumen的变量中,然后:

        merge(df1[,"index"],resumen,all.x = T)
        

        不客气:)

        【讨论】:

        • 嘿 Jorge,对于书面代码的答案,请使用代码部分(快捷键:标记代码按 ctrl + K)以便于阅读。 :-)
        猜你喜欢
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 2020-08-25
        • 2021-07-03
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        相关资源
        最近更新 更多