如何在R的apply函数中同步实现因子计算与id1/id2的运算?
嘿,想要用一次apply就搞定因子计算和id列的缩放,完全没问题!这样还能避免重复遍历数据,效率更高。我给你两种实用的实现方式,按需选择就行:
方式一:保留原id列,新增缩放后的列
如果你不想改动原始的id1-id4,只想新增缩放后的列和factor列,可以这么写:
# 定义原始数据框 dat <- data.frame(loc = c(1,2), year = c(1980,2012), id1 = c(5,6), id2 = c(10,12), id3 = c(14,18),id4 = c(10,12)) # 一次apply完成所有计算 scaled_results <- t(apply(dat[,3:6], 1, function(row) { # 计算当前行的因子 factor_val <- 100 / sum(row) # 返回因子 + 缩放后的id值 c(factor = factor_val, id1_scaled = row[1] * factor_val, id2_scaled = row[2] * factor_val, id3_scaled = row[3] * factor_val, id4_scaled = row[4] * factor_val) })) # 把结果合并到原数据框 dat_with_scaled <- cbind(dat[,1:2], dat[,3:6], as.data.frame(scaled_results)) # 查看结果 print(dat_with_scaled)
运行后输出:
loc year id1 id2 id3 id4 factor id1_scaled id2_scaled id3_scaled id4_scaled 1 1 1980 5 10 14 10 2.0833333 10.41667 20.83333 29.16667 20.83333 2 2 2012 6 12 18 12 1.7241379 10.34483 20.68966 31.03448 20.68966
方式二:直接覆盖原id列(更简洁)
如果不需要保留原始id值,想直接把缩放后的值替换原列,同时添加factor列,代码会更紧凑:
# 定义原始数据框 dat <- data.frame(loc = c(1,2), year = c(1980,2012), id1 = c(5,6), id2 = c(10,12), id3 = c(14,18),id4 = c(10,12)) # 直接在原数据框上更新 dat[, c("factor", "id1", "id2", "id3", "id4")] <- t(apply(dat[,3:6], 1, function(row) { factor_val <- 100 / sum(row) # 先返回factor,再返回缩放后的id值 c(factor_val, row * factor_val) })) # 查看结果 print(dat)
输出结果:
loc year id1 id2 id3 id4 factor 1 1 1980 10.41667 20.83333 29.16667 20.83333 2.0833333 2 2 2012 10.34483 20.68966 31.03448 20.68966 1.7241379
关键说明
- 用
t()转置apply的结果:因为apply默认会把每行的计算结果按列输出,转置后才能和原数据框的行一一对应。 - 匿名函数里先算
factor_val,再用它处理所有id列,这样就只用计算一次因子,避免重复求和,效率更高。
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

