可能存在或可能不存在的列的 Tidyverse Rowwise 总和
Tidyverse Rowwise sum of columns that may or may not exist
考虑以下小标题:
library(tidyverse)
data <- tibble(x = c(rnorm(5,2,n = 10)*1000,NA,1000),
y = c(rnorm(1,1,n = 10)*1000,NA,NA))
假设我想对“x”和“y”求和row-wise,创建变量“z”,如下所示:
data %>%
rowwise() %>%
mutate(z = sum(c(x,y), na.rm = T))
这对我想要的效果很好,但问题是我的真实数据集有很多变量而我没有
想在我有什么变量之前检查我没有什么变量。所以,假设我可能有求和的元素之间不存在的变量:
data %>%
rowwise() %>%
mutate(k = sum(c(x,y,w), na.rm = T))
在这种情况下,它不会运行,因为“w”列不存在。
无论如何,我怎样才能做到 运行,忽略“w”的 non-existence 并对“x”和“y”求和?
PS:我更喜欢在 运行 求和之前不过滤数据集。我想以某种方式使总和发生在任何情况下,无论变量是否存在。
如果我正确理解你的问题,这将是一个解决方案(@Duck 的评论略作修改:
library(tidyverse)
data <- tibble(x = c(rnorm(5,2,n = 10)*1000,NA,1000),
y = c(rnorm(1,1,n = 10)*1000,NA,NA),
a = c(rnorm(1,1,n = 10)*1000,NA,NA))
wishlist <- c("x","y","w")
data %>%
dplyr::rowwise() %>%
dplyr::mutate(Sum=sum(c_across(colnames(data)[colnames(data) %in% wishlist]),na.rm=T))
x y a Sum
<dbl> <dbl> <dbl> <dbl>
1 3496. 439. -47.7 3935.
2 6046. 460. 2419. 6506.
3 6364. 672. 1030. 7036.
4 1068. 1282. 2811. 2350.
5 2455. 990. 689. 3445.
6 6477. -612. -1509. 5865.
7 7623. 1554. 2828. 9177.
8 5120. 482. -765. 5602.
9 1547. 1328. 817. 2875.
10 5602. -1019. 695. 4582.
11 NA NA NA 0
12 1000 NA NA 1000
试试这个:
library(tidyverse)
data <- tibble(x = c(rnorm(5,2,n = 10)*1000,NA,1000),
y = c(rnorm(1,1,n = 10)*1000,NA,NA))
data$k <- rowSums(as.data.frame(data[,which(c("x","y","w")%in%names(data))]),na.rm=TRUE)
输出:
# A tibble: 12 x 3
x y k
<dbl> <dbl> <dbl>
1 3121. 934. 4055.
2 6523. 1477. 8000.
3 5538. 863. 6401.
4 3099. 1344. 4443.
5 4241. 284. 4525.
6 3251. -448. 2803.
7 4786. -291. 4495.
8 4378. 910. 5288.
9 5342. 653. 5996.
10 4772. 1818. 6590.
11 NA NA 0
12 1000 NA 1000
考虑以下小标题:
library(tidyverse)
data <- tibble(x = c(rnorm(5,2,n = 10)*1000,NA,1000),
y = c(rnorm(1,1,n = 10)*1000,NA,NA))
假设我想对“x”和“y”求和row-wise,创建变量“z”,如下所示:
data %>%
rowwise() %>%
mutate(z = sum(c(x,y), na.rm = T))
这对我想要的效果很好,但问题是我的真实数据集有很多变量而我没有 想在我有什么变量之前检查我没有什么变量。所以,假设我可能有求和的元素之间不存在的变量:
data %>%
rowwise() %>%
mutate(k = sum(c(x,y,w), na.rm = T))
在这种情况下,它不会运行,因为“w”列不存在。 无论如何,我怎样才能做到 运行,忽略“w”的 non-existence 并对“x”和“y”求和?
PS:我更喜欢在 运行 求和之前不过滤数据集。我想以某种方式使总和发生在任何情况下,无论变量是否存在。
如果我正确理解你的问题,这将是一个解决方案(@Duck 的评论略作修改:
library(tidyverse)
data <- tibble(x = c(rnorm(5,2,n = 10)*1000,NA,1000),
y = c(rnorm(1,1,n = 10)*1000,NA,NA),
a = c(rnorm(1,1,n = 10)*1000,NA,NA))
wishlist <- c("x","y","w")
data %>%
dplyr::rowwise() %>%
dplyr::mutate(Sum=sum(c_across(colnames(data)[colnames(data) %in% wishlist]),na.rm=T))
x y a Sum
<dbl> <dbl> <dbl> <dbl>
1 3496. 439. -47.7 3935.
2 6046. 460. 2419. 6506.
3 6364. 672. 1030. 7036.
4 1068. 1282. 2811. 2350.
5 2455. 990. 689. 3445.
6 6477. -612. -1509. 5865.
7 7623. 1554. 2828. 9177.
8 5120. 482. -765. 5602.
9 1547. 1328. 817. 2875.
10 5602. -1019. 695. 4582.
11 NA NA NA 0
12 1000 NA NA 1000
试试这个:
library(tidyverse)
data <- tibble(x = c(rnorm(5,2,n = 10)*1000,NA,1000),
y = c(rnorm(1,1,n = 10)*1000,NA,NA))
data$k <- rowSums(as.data.frame(data[,which(c("x","y","w")%in%names(data))]),na.rm=TRUE)
输出:
# A tibble: 12 x 3
x y k
<dbl> <dbl> <dbl>
1 3121. 934. 4055.
2 6523. 1477. 8000.
3 5538. 863. 6401.
4 3099. 1344. 4443.
5 4241. 284. 4525.
6 3251. -448. 2803.
7 4786. -291. 4495.
8 4378. 910. 5288.
9 5342. 653. 5996.
10 4772. 1818. 6590.
11 NA NA 0
12 1000 NA 1000