R 通过分组汇总所有行,并定义应保留的值

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

我有一个数据框,其中合并了多个数据源。这将创建具有相同id的行。现在我想定义应该保留哪些行中的值

到目前为止,我一直在将dplyr与group_by一起使用,并总结所有内容,以保留第一个值(如果不是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