我有一个像
Table1
这样的小标题,我想根据每行的值之和对一些列进行分组,用结果创建一个新列并替换求和的列,例如 Table2
。
Table1
| Col_A | INTER | Col_B | Col_C | Col_D |
| ----- | ------- | ----- | ----- | ----- |
| 1 | [5-15) | 2 | 4 | 2 |
| 1 | [15-25) | 1 | 3 | 6 |
| 1 | [25-35) | 1 | 1 | 2 |
在此示例中,我将对
Col_B
和 Col_D
中的值求和,并将结果保存在 Col_E
中。
Table2
| Col_A | INTER | Col_C | Col_E |
| --- | --- | --- | --- |
| 1 | [5-15) | 4 | 4 |
| 1 | [15-25) | 3 | 7 |
| 1 | [25-35) | 1 | 3 |
在我的真实数据中,我有几列(数字变量)并且它们具有 NA。
我尝试过:
Table2 <- Table1 %>% mutate(Col_E = rowSums(across(c(Col_B, Col_D))))
我收到此错误:
错误:
列mutate()
有问题。Col_E
我。Col_E = rowSums(...)
x 必须使用有效的下标向量对列进行子集化。
x 下标类型错误。 i 必须是数字或字符。 i 错误发生在第 1 组:Col_A = 1,INTER = "[5,15)"。logical
结合之前评论中的一些输入,添加一个稍微修改过的数据的表示,以解决 NA 删除问题,以及整洁列选择的示例以及如何预先指定新列的名称(如果您有几个,则很有用)您想要聚合的列组,例如将所有内容保留在列表中以进行映射)。
在这里,我使用 select(- ...) 删除了上一步中聚合的列,但如果您有兴趣仅保留新列,您可能还想研究 transmute() ,但从我的情况来看请阅读,这里的情况并非如此。
require(dplyr)
#> Loading required package: dplyr
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
df <- tribble(
~Col_A, ~INTER, ~ Col_B,~ Col_C, ~Col_D ,
1 , '[5-15)' , 2 , 4 , 2 ,
1 , '[15-25)' , 1 , 3 , NA ,
1 , '[25-35)' , 1 , 1 , 2
)
# pre-defined vector of column names
cols_add <- c('Col_B', 'Col_C', 'Col_D')
df %>%
mutate(!! col_sum := rowSums(across(all_of(cols_add)), na.rm = TRUE)) %>%
select(-all_of(cols_add))
#> # A tibble: 3 × 3
#> Col_A INTER Col_E
#> <dbl> <chr> <dbl>
#> 1 1 [5-15) 8
#> 2 1 [15-25) 4
#> 3 1 [25-35) 4
# you may also predefine the name of the result column, use !! and := in mutate
col_sum <- 'Col_E'
# using tidyselect with column index
df %>%
mutate(!! col_sum := rowSums(across(3:5), na.rm = TRUE)) %>%
select(-all_of(cols_add))
#> # A tibble: 3 × 3
#> Col_A INTER Col_E
#> <dbl> <chr> <dbl>
#> 1 1 [5-15) 8
#> 2 1 [15-25) 4
#> 3 1 [25-35) 4
# using tidyselect with regular expression
df %>%
mutate(!! col_sum := rowSums(across(matches('Col_[BCD]')), na.rm = TRUE)) %>%
select(-all_of(cols_add))
#> # A tibble: 3 × 3
#> Col_A INTER Col_E
#> <dbl> <chr> <dbl>
#> 1 1 [5-15) 8
#> 2 1 [15-25) 4
#> 3 1 [25-35) 4
创建于 2023-11-14,使用 reprex v2.0.2