如何按行计算匹配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
相关产品推荐
相关产品推荐

