R 通过分组汇总所有行,并定义应保留的值
我有一个数据框,其中合并了多个数据源。这将创建具有相同id的行。现在我想定义应该保留哪些行中的值 到目前为止,我一直在将dplyr与group_by一起使用,并总结所有内容,以保留第一个值(如果不是NA) 下面是一个例子:R 通过分组汇总所有行,并定义应保留的值,r,dplyr,summarize,R,Dplyr,Summarize,我有一个数据框,其中合并了多个数据源。这将创建具有相同id的行。现在我想定义应该保留哪些行中的值 到目前为止,我一直在将dplyr与group_by一起使用,并总结所有内容,以保留第一个值(如果不是NA) 下面是一个例子: # function f for summarizing f <- function(x) { x <- na.omit(x) if (length(x) > 0) first(x) else NA
# function f for summarizing
f <- function(x) {
x <- na.omit(x)
if (length(x) > 0) first(x) else NA
}
# test data
test <- data.frame(id = c(1,2,1,2), value1 = c("a",NA,"b","c"), value2 = c(0:4))
id value1 value2
1 a 0
2 <NA> 1
1 b 2
2 c 3
您可以通过将向量子集设置为与零不同的位置来修改
f
函数
f <- function(x) {
x <- na.omit(x)
x <- x[x != 0]
if (length(x) > 0) first(x) else NA
}
您可以将
f
函数编写为:
library(dplyr)
f <- function(x) x[!is.na(x) & x != 0][1]
test %>% group_by(id) %>% summarise(across(.fns = f))
# id value1 value2
# <dbl> <chr> <int>
#1 1 a 2
#2 2 c 1
库(dplyr)
f%group_by(id)%>%总结(跨越(.fns=f))
#id值1值2
#
#1 a 2
#2 2 c 1
如果数据中没有非零或非NA值,使用
[1]
将自动返回NA
。作为@RicS的旁注,从dplyr v1+
开始,summary_all()
已被弃用(取代)。您应该使用cross()
:
测试%>%
分组依据(id)%>%
总结(跨越(.f=f))
f <- function(x) {
x <- na.omit(x)
x <- x[x != 0]
if (length(x) > 0) first(x) else NA
}
test %>%
group_by(id) %>%
summarise_all(~f(.))
# A tibble: 2 x 3
id value1 value2
<dbl> <chr> <int>
1 1 a 2
2 2 c 1
library(dplyr)
f <- function(x) x[!is.na(x) & x != 0][1]
test %>% group_by(id) %>% summarise(across(.fns = f))
# id value1 value2
# <dbl> <chr> <int>
#1 1 a 2
#2 2 c 1