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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:54:56