首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R dplyr::c_across() rowSums中的奇怪行为

R dplyr::c_across() rowSums中的奇怪行为
EN

Stack Overflow用户
提问于 2021-09-02 10:47:24
回答 1查看 24关注 0票数 0

我正在尝试了解如何将rowSums()仅应用于特定的列。这是一个重述:

代码语言:javascript
复制
df <- tibble(
  "ride" = c("bicycle", "motorcycle", "car", "other"),
  "A" = c(1, NA, 1, NA),
  "B" = c(NA, 2, NA, 2)
)

我可以通过索引2:3得到想要的结果

代码语言:javascript
复制
df %>%
  mutate(total = rowSums(.[2:3], na.rm = TRUE))

# A tibble: 4 × 4
  ride           A     B total
  <chr>      <dbl> <dbl> <dbl>
1 bicycle        1    NA     1
2 motorcycle    NA     2     2
3 car            1    NA     1
4 other         NA     2     2

但是,如果我尝试按名称指定列,则会出现奇怪的结果

代码语言:javascript
复制
df %>%
  mutate(total = sum(c_across(c("A":"B")), na.rm = TRUE))

# A tibble: 4 × 4
  ride           A     B total
  <chr>      <dbl> <dbl> <dbl>
1 bicycle        1    NA     6
2 motorcycle    NA     2     6
3 car            1    NA     6
4 other         NA     2     6

我做错了什么?

我可以通过这样的方式实现我想要的:

代码语言:javascript
复制
df %>%
  mutate_all(~replace(., is.na(.), 0)) %>%
  mutate(total = A + B)

但是我想通过传递一个向量来指定列名,这样将来我就可以更改为不同的列名组合。这就是我想要实现的东西:

代码语言:javascript
复制
cols_to_sum <- c("A","B")

df %>%
  mutate(total = sum(across(cols_to_sum), na.rm = TRUE))
EN

回答 1

Stack Overflow用户

发布于 2021-09-02 10:51:13

您可以使用select指定要sum的列。

代码语言:javascript
复制
library(dplyr)

cols_to_sum <- c("A","B")

df %>%
  mutate(total = rowSums(select(., all_of(cols_to_sum)), na.rm = TRUE))

#  ride           A     B total
#  <chr>      <dbl> <dbl> <dbl>
#1 bicycle        1    NA     1
#2 motorcycle    NA     2     2
#3 car            1    NA     1
#4 other         NA     2     2

c_acrossrowwise协同工作-

代码语言:javascript
复制
df %>%
  rowwise() %>%
  mutate(total = sum(c_across(all_of(cols_to_sum)), na.rm = TRUE)) %>%
  ungroup
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69028784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档