基于多种模式R跨数据框的多列求和

sum across multiple columns of a data frame based on multiple patterns R

我有一个不同年份的多个变量的数据框,看起来有点像这样:

df <- data.frame(name=c("name1", "name2", "name3", "name4"),
                X1990=c(1,6,8,NA),
                X1990.1=c(10,20,NA,2),
                X1990.2=c(2,4,6,8),
                X1990.3=c(1,NA,3,6),
                X1990.4=c(8,7,5,4),
                X1991=c(2,6,3,5),
                X1991.1=c(NA,20,NA,2),
                X1991.2=c(NA,NA,NA,NA),
                X1991.3=c(1,NA,3,5),
                X1991.4=c(8,9,6,3))

我做了这个例子,每年只有 5 个变量,只有 2 年,但实际上是一个更大的 df,从 1990 年到 2020 年有几十个变量。

我想用同一年所有列的总和创建一个新的数据框,这样新的数据框看起来像这样:

df_sum <- data.frame(name=c("name1", "name2", "name3", "name4"),
                     X1990=c(22, 37, 22, 20),
                     X1991=c(11,35,12,15))

我在想一些循环 rowSums(across(matches('pattern')), na.rm = TRUE) 我在另一个问题上发现的,但到目前为止还没有成功实施。

谢谢!

我们可以使用 pivot_longer 重塑为 'long' 格式,并在重塑回 'wide'

的同时获得 sum
library(dplyr)
library(tidyr)
library(stringr)
df %>%
   pivot_longer(cols = starts_with("X"), names_to = "name1") %>% 
   mutate(name1 = str_remove(name1, "\.\d+$")) %>% 
   pivot_wider(names_from = name1, values_from = value, 
      values_fn = ~ sum(.x, na.rm = TRUE))

-输出

# A tibble: 4 × 3
  name  X1990 X1991
  <chr> <dbl> <dbl>
1 name1    22    11
2 name2    37    35
3 name3    22    12
4 name4    20    15

或者在base R中,使用split.default根据列名模式将数据拆分为list个数据集,得到rowSumscbind第一列

cbind(df[1], sapply(split.default(df[-1], 
  trimws(names(df)[-1], whitespace = "\.\d+")), rowSums, na.rm = TRUE))
   name X1990 X1991
1 name1    22    11
2 name2    37    35
3 name3    22    12
4 name4    20    15