使用 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 汇总数据并同时使用 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
结果 table 总结了整个 data.frame
的数据,而不是每个人的数据。
这两种方法(length
和 sum
)都在与 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'))))
我正在尝试使用 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 汇总数据并同时使用 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
结果 table 总结了整个 data.frame
的数据,而不是每个人的数据。
这两种方法(length
和 sum
)都在与 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'))))