![](/img/trans.png)
[英]Aggregate by group and get count, mean and sd of non-NA values for different data.frame columns
[英]Summarize data frame to return non-NA values along subsets
希望有人能帮助我一招。 我在网上找到了类似的问题,但我见过的所有例子都没有完全符合我的要求,也没有在我的数据结构上工作。
我需要沿着数据子集从数据帧中删除NA,并将剩余的NA值压缩为每个数据子集的行。
例:
#create example data
a <- c(1, 1, 1, 2, 2, 2) #this is the subsetting variable in the example
b <- c(NA, NA, "B", NA, NA, "C") #max 1 non-NA value for each subset
c <- c("A", NA, NA, "A", NA, NA)
d <- c(NA, NA, 1, NA, NA, NA) #some subsets for some columns have all NA values
dat <- as.data.frame(cbind(a, b, c, d))
> desired output
a b c d
1 B A 1
2 C A <NA>
经验法则:1)需要从每列中删除NA值2)沿数据子集循环(上例中的“a”列)3)对于每个子集,所有列的最大值均为1非NA值,但有些列可以具有所有NA值
思路:
感谢任何帮助将最终作品组合在一起! 谢谢!
使用dplyr::summarise_all
可以实现一个解决方案。 数据需要在a
上进行group_by
。
library(dplyr)
dat %>%
group_by(a) %>%
summarise_all(funs(.[which.min(is.na(.))]))
# # A tibble: 2 x 4
# a b c d
# <fctr> <fctr> <fctr> <fctr>
# 1 1 B A 1
# 2 2 C A <NA>
不确定这是否是您正在寻找的,但这可能对您有用。 它至少会复制您正在寻找的小样本输出:
library(dplyr)
library(tidyr)
dat %>%
filter_at(vars(b:c), any_vars(!is.na(.))) %>%
group_by(a) %>%
fill(b) %>%
fill(c) %>%
filter_at(vars(b:c), all_vars(!is.na(.)))
# A tibble: 2 x 4
# Groups: a [2]
a b c d
<fctr> <fctr> <fctr> <fctr>
1 1 B A 1
2 2 C A NA
你也可以只使用dplyr
:
dat %>%
group_by(a) %>%
summarise_each(funs(first(.[!is.na(.)])))
data.table
和na.omit
解决方案
library(data.table)
merge(setDT(dat)[,a[1],keyby=a], setDT(dat)[,na.omit(.SD),keyby=a],all.x=TRUE)
我认为合并声明可以改进
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.