按组将数据框多列与指定列执行乘除运算的实现方法
分组处理多列乘除运算的解决方案
先来看你的数据集结构:
# A tibble: 95 x 7 # Groups: WallReg_2p5 [19] CellID_2p5 Y_Coord_2p5Weighting WallReg_2p5 piC_1 piC_2 piC_3 piC_4 <int> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> 1 6561 0.915 African 6.55 6.63 5.84 0.766 2 6278 0.947 African 15.1 5.59 2.15 2.01 3 4394 0.971 African 11.4 3.92 0.774 1.47 4 4840 0.994 African 4.70 0.962 6.21 3.54 5 4105 0.947 African 6.35 2.10 2.25 3.24 6 5228 1.000 Amazonian 8.49 5.00 1.92 2.42 7 5089 1.000 Amazonian 15.6 6.48 2.53 2.89 8 4939 0.998 Amazonian 5.56 2.94 0.389 2.44 9 5088 1.000 Amazonian 12.9 5.16 1.99 3.13 10 4947 0.998 Amazonian 8.05 11.2 2.54 4.61 # ... with 85 more rows
以下是该数据框子集的dput()输出:
structure(list(CellID_2p5 = c(6561L, 6278L, 4394L, 4840L, 4105L, 5228L, 5089L, 4939L, 5088L, 4947L, 1710L, 2569L, 1438L, 1175L, 1840L, 6888L, 7185L, 6031L, 7045L, 7044L, 3432L, 3288L, 3143L, 3574L, 3577L, 3260L, 1959L, 2568L, 2986L, 2386L, 5551L, 5407L, 5556L, 4979L, 5694L, 5303L, 4442L, 5587L, 5157L, 4865L, 3294L, 3009L, 2865L, 2722L, 3151L, 6427L, 6571L, 5996L, 6570L, 6139L, 3631L, 3920L, 3342L, 3341L, 4064L, 2617L, 2049L, 3346L, 1599L, 3205L, 7487L, 6612L, 6613L, 7630L, 7916L, 3854L, 3561L, 4290L, 4138L, 3704L, 4211L, 4068L, 4069L, 4357L, 4648L, 5601L, 5600L, 5455L, 5456L, 5458L, 3978L, 3822L, 3532L, 3832L, 3834L, 7105L, 6817L, 6104L, 7963L, 6098L, 3418L, 3424L, 3281L, 3566L, 3273L ), Y_Coord_2p5Weighting = c(0.915311479119447, 0.946930129495106, 0.971342069813261, 0.99405633822232, 0.946930129495106, 0.999762027079909, 0.999762027079909, 0.997858923238603, 0.999762027079909, 0.997858923238603, 0.480988768919388, 0.691513055782269, 0.402746689858737, 0.362438038283702, 0.518773258160522, 0.876726755707508, 0.831469612302545, 0.971342069813261, 0.854911870672947, 0.854911870672947, 0.854911870672947, 0.831469612302545, 0.806444604267483, 0.876726755707508, 0.876726755707508, 0.831469612302545, 0.555570233019602, 0.691513055782269, 0.779884483092882, 0.659345815100069, 0.99405633822232, 0.997858923238603, 0.99405633822232, 0.997858923238603, 0.988361510467761, 0.999762027079909, 0.971342069813261, 0.99405633822232, 0.999762027079909, 0.99405633822232, 0.831469612302545, 0.779884483092882, 0.751839807478977, 0.722363962059756, 0.806444604267483, 0.932007869282799, 0.915311479119447, 0.971342069813261, 0.915311479119447, 0.960049854385929, 0.896872741532688, 0.932007869282799, 0.854911870672947, 0.854911870672947, 0.946930129495106, 0.722363962059756, 0.591309648363582, 0.854911870672947, 0.480988768919388, 0.831469612302545, 0.779884483092882, 0.915311479119447, 0.915311479119447, 0.751839807478977, 0.691513055782269, 0.915311479119447, 0.876726755707508, 0.960049854385929, 0.946930129495106, 0.896872741532688, 0.960049854385929, 0.946930129495106, 0.946930129495106, 0.971342069813261, 0.988361510467761, 0.99405633822232, 0.99405633822232, 0.997858923238603, 0.997858923238603, 0.997858923238603, 0.932007869282799, 0.915311479119447, 0.876726755707508, 0.915311479119447, 0.915311479119447, 0.831469612302545, 0.876726755707508, 0.960049854385929, 0.659345815100069, 0.960049854385929, 0.854911870672947, 0.854911870672947, 0.831469612302545, 0.876726755707508, 0.831469612302545), WallReg_2p5 = c("African", "African", "African", "African", "African", "Amazonian", "Amazonian", "Amazonian", "Amazonian", "Amazonian", "Arctico-Siberian", "Arctico-Siberian", "Arctico-Siberian", "Arctico-Siberian", "Arctico-Siberian", "Australian", "Australian", "Australian", "Australian", "Australian", "Chinese", "Chinese", "Chinese", "Chinese", "Chinese", "Eurasian", "Eurasian", "Eurasian", "Eurasian", "Eurasian", "Guineo-Congolian", "Guineo-Congolian", "Guineo-Congolian", "Guineo-Congolian", "Guineo-Congolian", "Indo-Malayan", "Indo-Malayan", "Indo-Malayan", "Indo-Malayan", "Indo-Malayan", "Japanese", "Japanese", "Japanese", "Japanese", "Japanese", "Madagascan", "Madagascan", "Madagascan", "Madagascan", "Madagascan", "Mexican", "Mexican", "Mexican", "Mexican", "Mexican", "North American", "North American", "North American", "North American", "North American", "Novozelandic", "Novozelandic", "Novozelandic", "Novozelandic", "Novozelandic", "Oriental", "Oriental", "Oriental", "Oriental", "Oriental", "Panamanian", "Panamanian", "Panamanian", "Panamanian", "Panamanian", "Papua-Melanesian", "Papua-Melanesian", "Papua-Melanesian", "Papua-Melanesian", "Papua-Melanesian", "Saharo-Arabian", "Saharo-Arabian", "Saharo-Arabian", "Saharo-Arabian", "Saharo-Arabian", "South American", "South American", "South American", "South American", "South American", "Tibetan", "Tibetan", "Tibetan", "Tibetan", "Tibetan"), piC_1 = c(6.54637718200684, 15.1273813247681, 11.4171981811523, 4.70245027542114, 6.35227298736572, 8.48885822296143, 15.5538415908813, 5.56155681610107, 12.9046697616577, 8.0451765060424...
核心需求
我的真实数据集包含10368行和255611列,需按WallReg_2p5分组,将多个以piC_开头的列与Y_Coord_2p5Weighting列执行乘除运算。
解决方案
针对这种大规模数据集的分组批量列运算,用dplyr包的group_by() + mutate(across())组合是最高效的方式,不需要手动遍历每一列。以下是具体代码:
1. 乘法运算(piC列 × Y_Coord列)
如果是要给每个piC列乘以权重列,并且生成新的结果列:
library(dplyr) # 生成带后缀的新列,比如piC_1_weighted data_processed <- data %>% group_by(WallReg_2p5) %>% mutate(across(starts_with("piC_"), ~ .x * Y_Coord_2p5Weighting, .names = "{.col}_weighted")) %>% ungroup() # 可选:如果后续不需要保留分组状态,取消分组
2. 除法运算(piC列 ÷ Y_Coord列)
如果是除法需求,只需要把*替换成/即可:
data_processed <- data %>% group_by(WallReg_2p5) %>% mutate(across(starts_with("piC_"), ~ .x / Y_Coord_2p5Weighting, .names = "{.col}_divided")) %>% ungroup()
关键说明
starts_with("piC_")会自动匹配所有以piC_开头的列,不管有多少列都能批量处理,完美适配你的25万+列的数据集- `.names = "{.col}_
相关产品推荐
相关产品推荐

