条件计算均值

Mik*_*sin 10 r dplyr

我想计算每个因子的数据框的平均值,但仅在满足某些条件时才计算.例如,我有这个数据框:

> df <- data.frame(name = rep(c("A", "B", "C"), 20), 
                 variable1 = rep(c(1, 1, 1, 1, 1, NA), 10), 
                 variable2 = rep(c(2, NA, 2, 2, 2, 2), 10), 
                 variable3 = rep(c(NA, 3, 3, 3, 3, 3), 10))

> table(df$name, df$variable1)

     1
  A 20
  B 20
  C 10

> table(df$name, df$variable2)

     2
  A 20
  B 10
  C 20

> table(df$name, df$variable3)

     3
  A 10
  B 20
  C 20
Run Code Online (Sandbox Code Playgroud)

我可以dplyr通过以下方式轻松计算每个变量的均值:

means <- df %>%
  group_by(name) %>%
  summarise_each(funs(mean(., na.rm = TRUE)))
> means
Source: local data frame [3 x 4]

  name variable1 variable2 variable3
1    A         1         2         3
2    B         1         2         3
3    C         1         2         3
Run Code Online (Sandbox Code Playgroud)

但是,我想要的是仅计算11个或更多观测值的平均值,否则将其放入NA相应的单元格中.换句话说,结果应如下所示:

  name variable1 variable2 variable3
1    A         1         2        NA
2    B         1        NA         3
3    C        NA         2         3
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们可以创建一个函数(f1)来表示ifNA值的数量大于11(sum(!is.na(x))>11),否则我们得到NA.我使用NA_real_的默认NA是逻辑类,并且在某些包中可能存在类的冲突.

使用dplyr,我们分组name并使用函数(f1)summarise_each

f1 <- function(x) if(sum(!is.na(x))>11) mean (x, na.rm=TRUE) else NA_real_
library(dplyr) 
df  %>% 
     group_by(name) %>%
     summarise_each(funs(f1))
Run Code Online (Sandbox Code Playgroud)

或者使用类似的方法data.table将转换data.framedata.table(setDT(df)).我们遍历列(lapply(.SD, ..)),使用相同的功能分组name

library(data.table)
setDT(df)[,  lapply(.SD, f1), by = name]
#   name variable1 variable2 variable3
#1:    A         1         2        NA
#2:    B         1        NA         3
#3:    C        NA         2         3
Run Code Online (Sandbox Code Playgroud)

  • @DavidArenburg,是的,因为我从未使用过data.table,但确实对dplyr有一些经验. (3认同)