我得到一个数据框:
a <- c('A','A','B','B','A')
b <- c(1,1,1,1,2)
c <- c(NA,60,NA,100,NA)
d <- c(10,NA,10,NA,100)
frame <- data.frame(a,b,c,d)
> frame
a b c d
1 A 1 NA 10
2 A 1 60 NA
3 B 1 NA 10
4 B 1 100 NA
5 A 2 NA 100
我想用a和b来聚合它
>frame2
a b c d
1 A 1 60 10
3 B 1 100 10
5 A 2 NA 100
我尝试了一些东西,比如aggregat()和dplyr的group,但不知何故,它从来没有工作过。
4条答案
按热度按时间fhg3lkii1#
对于
aggregate
,我们可能需要使用na.action
如果我们打算对行进行子集化
zlhcx6iw2#
data.table
和hablar::sum_
:*base
中,我们可以定义自己的函数,并将其与aggregate
一起使用,如akrun在他们的答案中所示:*5hcedyr03#
除了@akrun使用
aggreate()
之外,您还可以使用以下代码来创建它:使得
xxb16uws4#
使用
dplyr
和tidyr
,您可以将数据整形为长格式,过滤NA行,然后重新整形为宽。这基本上结合了c和d值,并保留了c列中的NA
。IMO的一个小烦恼是,与以前的
tidyr::spread
不同,tidyr::pivot_wider
保持了数据的顺序;如果你不调用arrange
,你将得到列d,然后是c,因为过滤后的观察顺序。