当有 NA 值时,如何使用 dplyr return 所有数字列的分组总和?
How to use dplyr to return the grouped sum of all numeric columns when there are NA values?
我正在尝试使用 dplyr 的 group_by 对所有数字列求和,并总结如下函数。我不明白从 summarize 函数返回的错误并且似乎无法在堆栈溢出上找到类似的例子......但是在两个成员指出我在制作示例数据时的错误之后我发现我必须准备提供的代码分组汇总报告正确!
# Dummy data
a <- c(1, NA, 1, NA, 1, 1)
b <- c( NA, 1, NA, 1, NA, NA)
c <- c( 1, 1, 1, NA, 1, 1)
d <- c( 1, 1, 1, NA, 1, NA)
e <- c( NA, 1, 1, NA, 1, 1)
f <- c( 1, NA, 1, NA, 1, 1)
# Make a tibble
tmp <- bind_cols(a, b, c, d, e)
names(tmp) <- c("A", "B", "C", "D", "E")
ID <- c("X", "X", "Y", "Y", "Z", "Z")
tmp <-bind_cols(ID, tmp)
names(tmp)[1] <- "ID"
# Return a sum report
tmp %>%
group_by(ID) %>%
summarise(across(everything(), ~ sum(.x, na.rm = TRUE)))
# A tibble: 3 × 6
ID A B C D E
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 X 1 1 2 2 1
2 Y 1 1 1 1 1
3 Z 2 0 2 1 2
最好避免定义具有不同数据类型的向量,因为 R 会将向量转换为单一数据类型。
我认为您可能希望像这样创建数据:
tmp = tibble(
ID = c('X', 'X', 'Y', 'Y', 'Z', 'Z'),
A = c(1, NA, 1, 1, NA, 1),
B = c(NA, 1, 1, 1, 1, NA),
C = c(1, NA, 1, 1, 1, 1),
D = c(NA, 1, NA, NA, NA, NA),
E = c(1, NA, 1, 1, 1, 1))
然后做:
tmp %>%
group_by(ID) %>%
summarise(across(everything(), ~ sum(.x, na.rm = TRUE)))
获得:
# A tibble: 3 x 6
ID A B C D E
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 X 1 1 1 1 1
2 Y 2 2 2 0 2
3 Z 1 1 2 0 2
我正在尝试使用 dplyr 的 group_by 对所有数字列求和,并总结如下函数。我不明白从 summarize 函数返回的错误并且似乎无法在堆栈溢出上找到类似的例子......但是在两个成员指出我在制作示例数据时的错误之后我发现我必须准备提供的代码分组汇总报告正确!
# Dummy data
a <- c(1, NA, 1, NA, 1, 1)
b <- c( NA, 1, NA, 1, NA, NA)
c <- c( 1, 1, 1, NA, 1, 1)
d <- c( 1, 1, 1, NA, 1, NA)
e <- c( NA, 1, 1, NA, 1, 1)
f <- c( 1, NA, 1, NA, 1, 1)
# Make a tibble
tmp <- bind_cols(a, b, c, d, e)
names(tmp) <- c("A", "B", "C", "D", "E")
ID <- c("X", "X", "Y", "Y", "Z", "Z")
tmp <-bind_cols(ID, tmp)
names(tmp)[1] <- "ID"
# Return a sum report
tmp %>%
group_by(ID) %>%
summarise(across(everything(), ~ sum(.x, na.rm = TRUE)))
# A tibble: 3 × 6
ID A B C D E
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 X 1 1 2 2 1
2 Y 1 1 1 1 1
3 Z 2 0 2 1 2
最好避免定义具有不同数据类型的向量,因为 R 会将向量转换为单一数据类型。
我认为您可能希望像这样创建数据:
tmp = tibble(
ID = c('X', 'X', 'Y', 'Y', 'Z', 'Z'),
A = c(1, NA, 1, 1, NA, 1),
B = c(NA, 1, 1, 1, 1, NA),
C = c(1, NA, 1, 1, 1, 1),
D = c(NA, 1, NA, NA, NA, NA),
E = c(1, NA, 1, 1, 1, 1))
然后做:
tmp %>%
group_by(ID) %>%
summarise(across(everything(), ~ sum(.x, na.rm = TRUE)))
获得:
# A tibble: 3 x 6
ID A B C D E
<chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 X 1 1 1 1 1
2 Y 2 2 2 0 2
3 Z 1 1 2 0 2