You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按行计算匹配p_*模式的列的乘积(支持忽略NA值且适配任意数量目标列)

按行计算所有p_*列的乘积(忽略NA+适配任意列数)

针对你的需求,我整理了一个简洁且通用的方案,用dplyr就能轻松实现,不管你有多少个p_开头的列都能自动适配,还会忽略NA值:

先准备好环境和测试数据

首先确保加载了必要的包,然后把你的示例数据框定义出来(方便测试):

library(tibble)
library(dplyr)

dt = tibble::tibble(
  id_0 = rep(123, 6),
  name_0 = rep("A", 6),
  id_1 = c(rep(321, 3), rep(322, 3)),
  name_1 = c(rep("B", 3), rep("C", 3)),
  p_1 = c(rep(0.7, 3), rep(0.3, 3)),
  id_2 = c(NA, 323:326, NA),
  name_2 = c(NA, "D", "E", "J", "G", NA),
  p_2 = c(NA, 0.8, 0.2, 0.9, 0.1, NA),
  id_3 = c(NA, NA, 323, NA, NA, NA),
  na_3 = c(NA, NA, "H", NA, NA, NA),
  p_3 = c(NA, NA, 1, NA, NA, NA),
)

核心代码:计算乘积

用rowwise()按行处理,c_across(starts_with("p_"))自动选中所有p_开头的列,再用prod(na.rm = TRUE)忽略NA计算乘积:

dt_with_product <- dt %>%
  rowwise() %>%
  mutate(Product = prod(c_across(starts_with("p_")), na.rm = TRUE)) %>%
  ungroup()

看结果!

运行后得到的dt_with_product完全符合你的期望:

# A tibble: 6 × 12
  id_0 name_0 id_1 name_1   p_1 id_2 name_2   p_2 id_3 na_3   p_3 Product
  <dbl> <chr>  <dbl> <chr>  <dbl> <int> <chr>  <dbl> <dbl> <chr> <dbl>   <dbl>
1   123 A       321 B        0.7    NA NA      NA      NA NA      NA    0.7  
2   123 A       321 B        0.7   323 D       0.8     NA NA      NA    0.56 
3   123 A       321 B        0.7   324 E       0.2    323 H       1    0.14 
4   123 A       322 C        0.3   325 J       0.9     NA NA      NA    0.27 
5   123 A       322 C        0.3   326 G       0.1     NA NA      NA    0.03 
6   123 A       322 C        0.3    NA NA      NA      NA NA      NA    0.3  

为什么这个方案通用?

  • 适配任意p_*列数:starts_with("p_")会自动匹配所有列名以p_开头的列,不管你后续新增p_4、p_5还是更多,代码都不用改。
  • 自动忽略NA:prod()的na.rm = TRUE参数会跳过所有NA值,只计算非NA的乘积,刚好符合你的要求。

内容的提问来源于stack exchange,提问作者Cristhian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:42:46