如何在 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 列,而且它们会继续变化。

如有任何建议,将不胜感激!

结合使用rowwisec_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