创建一个新列,其中包含 R 上小标题中某些列的值之和

问题描述 投票:0回答:1

我有一个像

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 下标类型错误
logical
。 i 必须是数字或字符。 i 错误发生在第 1 组:Col_A = 1,INTER = "[5,15)"。

r dplyr sum tibble rowsum
1个回答
0
投票

结合之前评论中的一些输入,添加一个稍微修改过的数据的表示,以解决 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

© www.soinside.com 2019 - 2024. All rights reserved.