我正在尝试使用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汇总数据并同时使用{{1 }和length
函数。
sum
如下所示,
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
的数据,而不是每个人的数据。
这两种方法(data.frame
和length
)都在努力与sum
中的NAs进行斗争。任何建议都会受到赞赏。
编辑使用包含因子的新数据集。是否也可以计算&#34;谢谢&#34;对于每个人?
答案 0 :(得分:3)
我们可以使用dplyr
。我们按&lt; IndID&#39;分组,并使用summarise_each
为每列获得1的计数。要删除NA
元素,请na.omit
或使用逻辑条件仅输出TRUE
。
library(dplyr)
dat %>%
group_by(IndID) %>%
summarise_each(funs(sum(.==1 & !is.na(.))))
#or
#summarise_each(funs(sum(na.omit(.)==1)))
根据OP帖子中的更新数据集,如果我们想要计算“感谢”数据。在第三列中,我们可以使用%in%
(假设&#39;感谢&#39;在其他两列中不存在,而1则不在最后一列中。)
dat %>%
group_by(IndID) %>%
summarise_each(funs(sum(na.omit(.) %in% c(1, 'Thanks'))))