基于多种模式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
个数据集,得到rowSums
和cbind
第一列
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
我有一个不同年份的多个变量的数据框,看起来有点像这样:
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
个数据集,得到rowSums
和cbind
第一列
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