使用 ddply 函数用 NA 汇总数据

summarize data with NAs using ddply function

我正在尝试使用 NA 值汇总数据并使用 ddply 函数。

例如,使用下面包含的数据,

set.seed(123)
dat <- data.frame(IndID = rep(c("AAA", "BBB", "CCC"), 100),
        ValOne = sample(c(1, 0, NA), replace = T, 300),
        ValTwo = sample(c(1,NA), replace = T, 300),
        VarThree = sample(c("Thanks", "alot"), replace = T, 300))

> head(dat)
  IndID ValOne ValTwo
1   AAA      1     NA
2   BBB     NA      1
3   CCC      0     NA
4   AAA     NA     NA
5   BBB     NA     NA
6   CCC      1      1

我想计算每个人在 ValOne 和 ValTwo 列中有 1 的次数我正在使用下面的代码创建一个新的 data.frame 并按 IndID 汇总数据并同时使用 lengthsum 函数。

library(plyr)
tbl <- ddply(dat, "IndID", summarise, 
    ColOne = length(dat$ValOne[dat$ColOne == 1]),
    NumHighHDOP = sum(dat$ValTwo[dat$ValTwo == 1], na.rm = T))

如下所示,

 IndID ColOne NumHighHDOP
1   AAA      0         155
2   BBB      0         155
3   CCC      0         155

结果 table 总结了整个 data.frame 的数据,而不是每个人的数据。

这两种方法(lengthsum)都在与 data.frame. 中的 NA 作斗争。如有任何建议,我们将不胜感激。

EDIT 新数据集包含一个因子。是不是也可以算出每个人的"Thanks"个数?

我们可以使用dplyr。我们按 'IndID' 分组,并用 summarise_each 得到每一列的计数 1。要删除 NA 元素,可以 na.omit 或使用逻辑条件输出 TRUE only for 1.

library(dplyr)
dat %>%
   group_by(IndID) %>% 
   summarise_each(funs(sum(.==1 & !is.na(.))))
   #or
   #summarise_each(funs(sum(na.omit(.)==1)))

更新

根据OP的post中更新的数据集,如果我们要统计第三列中的'Thanks',我们可以使用%in%(假设'Thanks' 不在其他两列中,1 不在最后一列中)。

dat %>% 
   group_by(IndID) %>%
   summarise_each(funs(sum(na.omit(.) %in% c(1, 'Thanks'))))