如何在 R 中将一系列列相乘?
How do I multiply a range of columns together in R?
我只想将我的数字列相乘以创建一个新列。
下面的例子是一个简化,因为我将有比 2 多得多的数字列,所以不能只做 df$C2 * df$C3
。
基本上如果我有一个 table 看起来像:
df <- data.frame(C1=c('A','B','C','D'),C2=c(1,2,3,4),C3=c(5,6,7,8))
C1 C2 C3
1 A 1 5
2 B 2 6
3 C 3 7
4 D 4 8
我想 return C4 其中:
C1 C2 C3 C4
1 A 1 5 5
2 B 2 6 12
3 C 3 7 21
4 D 4 8 32
我想以一种比写出每一列更动态的方式来做到这一点,因为我有超过 2 列,而且它们会继续变化。
如有任何建议,将不胜感激!
结合使用rowwise
和c_across
。
最重要的部分可能是指定 select 的列,这可以通过不同的 tidy select 助手来完成。这是一个选项,假设您所有的列都以 C 开头,后跟一个数字:
df %>%
rowwise() %>%
mutate(C4 = prod(c_across(num_range('C', 2:3)))) %>%
ungroup()
# A tibble: 4 x 4
C1 C2 C3 C4
<chr> <dbl> <dbl> <dbl>
1 A 1 5 5
2 B 2 6 12
3 C 3 7 21
4 D 4 8 32
x <- c('C2', 'C3')
y <- paste0('df$', x, collapse='*')
df$C4 <- eval(parse(text=y))
如果列数未知但处理从第 2 列开始,您可以尝试以下操作
library(dplyr)
df%>%
rowwise()%>%
mutate(tmp_prod = prod(dplyr::c_across(2:last_col()),na.rm = T))
输出:
C1 C2 C3 tmp_prod
<chr> <dbl> <dbl> <dbl>
1 A 1 5 5
2 B 2 6 12
3 C 3 7 21
4 D 4 8 32
我只想将我的数字列相乘以创建一个新列。
下面的例子是一个简化,因为我将有比 2 多得多的数字列,所以不能只做 df$C2 * df$C3
。
基本上如果我有一个 table 看起来像:
df <- data.frame(C1=c('A','B','C','D'),C2=c(1,2,3,4),C3=c(5,6,7,8))
C1 C2 C3
1 A 1 5
2 B 2 6
3 C 3 7
4 D 4 8
我想 return C4 其中:
C1 C2 C3 C4
1 A 1 5 5
2 B 2 6 12
3 C 3 7 21
4 D 4 8 32
我想以一种比写出每一列更动态的方式来做到这一点,因为我有超过 2 列,而且它们会继续变化。
如有任何建议,将不胜感激!
结合使用rowwise
和c_across
。
最重要的部分可能是指定 select 的列,这可以通过不同的 tidy select 助手来完成。这是一个选项,假设您所有的列都以 C 开头,后跟一个数字:
df %>%
rowwise() %>%
mutate(C4 = prod(c_across(num_range('C', 2:3)))) %>%
ungroup()
# A tibble: 4 x 4
C1 C2 C3 C4
<chr> <dbl> <dbl> <dbl>
1 A 1 5 5
2 B 2 6 12
3 C 3 7 21
4 D 4 8 32
x <- c('C2', 'C3')
y <- paste0('df$', x, collapse='*')
df$C4 <- eval(parse(text=y))
如果列数未知但处理从第 2 列开始,您可以尝试以下操作
library(dplyr)
df%>%
rowwise()%>%
mutate(tmp_prod = prod(dplyr::c_across(2:last_col()),na.rm = T))
输出:
C1 C2 C3 tmp_prod
<chr> <dbl> <dbl> <dbl>
1 A 1 5 5
2 B 2 6 12
3 C 3 7 21
4 D 4 8 32