使用ddply函数

时间:2015-10-07 17:35:01

标签: r dplyr plyr

我正在尝试使用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.framelength)都在努力与sum中的NAs进行斗争。任何建议都会受到赞赏。

编辑使用包含因子的新数据集。是否也可以计算&#34;谢谢&#34;对于每个人?

1 个答案:

答案 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'))))