根据 r 中另一个文本列中给出的范围跨列求和

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

我想根据文本列(col_range)中给出的列范围为行总计创建新列。我尝试了以下操作,但它引发了错误。有谁知道如何做到这一点。

d = data.frame(index_id = c("a1232","c198", "s345","2ert", "e234","e567"),
               yr_ref = c(2023,2024,2025,2024,2027,NA),
               temp2023 = c(2000,5000,2300,2000,1000,200),
               temp2024 = c(3000,3000,3000,0,0,200),
               temp2025 = c(2000,3000,0,800,8000,200),
               temp2026 = c(300,200,1000,0,0,200),
               temp2027= c(1300,1200,100,10,10,200),
               col_range = c("temp2023:temp2023","temp2023:temp2024","temp2023:temp2025","temp2023:temp2024","temp2023:temp2027",NA))

d= d %>% 
  mutate(temp_total= ifelse(!is.na(yr_ref),
                               sum(c_across(col_range)),NA))

#### ERROR
Error in `mutate()`:
ℹ In argument: `temp_total = ifelse(!is.na(yr_ref), sum(c_across(col_range)), NA)`.
Caused by error in `sum()`:
! invalid 'type' (character) of argument
Run `rlang::last_trace()` to see where the error occurred.```
r dplyr rowsum
1个回答
0
投票

这是如何处理错误的一种选择:

d %>% 
  rowwise() %>% 
  mutate(temp_total = ifelse(!is.na(yr_ref), sum(c_across(matches("temp\\d{4}"))), NA)) %>%
  ungroup()

# A tibble: 6 × 9
  index_id yr_ref temp2023 temp2024 temp2025 temp2026 temp2027 col_range         temp_total
  <chr>     <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl> <chr>                  <dbl>
1 a1232      2023     2000     3000     2000      300     1300 temp2023:temp2023       8600
2 c198       2024     5000     3000     3000      200     1200 temp2023:temp2024      12400
3 s345       2025     2300     3000        0     1000      100 temp2023:temp2025       6400
4 2ert       2024     2000        0      800        0       10 temp2023:temp2024       2810
5 e234       2027     1000        0     8000        0       10 temp2023:temp2027       9010
6 e567         NA      200      200      200      200      200 NA                        NA
© www.soinside.com 2019 - 2024. All rights reserved.