如何在 R 中将一系列列相乘?

发布于 2025-01-09 02:34:11 字数 471 浏览 1 评论 0原文

我想要做的就是将数字列相乘以创建一个新列。

下面的示例是一个简化,因为我的数字列数远多于 2,因此不能只执行 df$C2 * df$C3

本质上,如果我有一个看起来像这样的表:

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

我想返回 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 个列,并且它们将继续更改。

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

All I want to do is multiply my numeric columns together to create a new column.

The below example is a simplification in that I'll have far more numeric columns than 2, so can't just do df$C2 * df$C3.

Essentially if I have a table that looks like:

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

I'd like to return C4 where:

   C1 C2 C3 C4
1  A  1  5  5
2  B  2  6  12
3  C  3  7  21
4  D  4  8  32

I'd like to do it in a more dynamic way than writing out each column as I have far more than 2 and they'll continue to change.

Any advice would be greatly appreciated please!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

江南月 2025-01-16 02:34:11

rowwisec_across 结合使用。

最重要的部分可能是指定要选择的列,这可以使用不同的整洁选择助手来完成。这是一个选项,假设所有列都以 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

Use rowwise in combination with c_across.

And the most important part probably is to specify the columns to select which can be done with different tidy select helpers. Here‘s one option, assuming that all your columns start with C followed by a number:

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
べ映画 2025-01-16 02:34:11

如果列数未知但处理从第 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

You can try the following if the number of columns are unknown but processing starts from column#2

library(dplyr)
df%>%
  rowwise()%>%
  mutate(tmp_prod = prod(dplyr::c_across(2:last_col()),na.rm = T))

Output:

 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
终止放荡 2025-01-16 02:34:11
x <- c('C2', 'C3')

y <- paste0('df
, x, collapse='*')

df$C4 <- eval(parse(text=y))
x <- c('C2', 'C3')

y <- paste0('df
, x, collapse='*')

df$C4 <- eval(parse(text=y))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文