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

如何用for()循环将数据处理逻辑应用到long数据集所有行填充new_df

R数据框填充:基于long数据集用for循环完成new_df剩余内容填充

现有数据结构

待填充的数据框new_df

new_df<-structure(list(id = c("R_88j7lG37gLfxk22", "R_88j7lG37gLfxk22", 
"R_88j7lG37gLfxk22", "R_88j7lG37gLfxk22", "R_88j7lG37gLfxk22", 
"R_88j7lG37gLfxk22", "R_88j7lG37gLfxk22", "R_88j7lG37gLfxk22", 
"R_88j7lG37gLfxk22", "R_88j7lG37gLfxk22", "R_88j7lG37gLfxk22", 
"R_88j7lG37gLfxk22", "R_6DK8lERVf8lSQf4", "R_6DK8lERVf8lSQf4", 
"R_6DK8lERVf8lSQf4", "R_6DK8lERVf8lSQf4", "R_6DK8lERVf8lSQf4", 
"R_6DK8lERVf8lSQf4", "R_6DK8lERVf8lSQf4", "R_6DK8lERVf8lSQf4", 
"R_6DK8lERVf8lSQf4", "R_6DK8lERVf8lSQf4", "R_6DK8lERVf8lSQf4", 
"R_6DK8lERVf8lSQf4"), choice = c(0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 
1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1), low_env = c(NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA), mid_env = c(NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA), high_env = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), low_eth = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA), mid_eth = c(NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA), high_eth = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), 
    `low_pri($25)` = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), 
    `mid_pri($75)` = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), 
    `high_pri($125)` = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
    )), row.names = c(NA, 24L), class = "data.frame")

参考数据集long

long<-structure(list(id = c("R_88j7lG37gLfxk22", "R_6DK8lERVf8lSQf4"
), t1_choice = c("2", "3"), t2_choice = c("1", "3"), t3_choice = c("1", 
"2"), t4_choice = c("2", "1"), t1_p1_env = c("high_env", "mid_env"
), t1_p1_eth = c("low_eth", "mid_eth"), t1_p1_pri = c("$125", 
"$25"), t1_p2_env = c("mid_env", "high_env"), t1_p2_eth = c("high_eth", 
"low_eth"), t1_p2_pri = c("$25", "$75"), t1_p3_env = c("low_env", 
"low_env"), t1_p3_eth = c("mid_eth", "low_eth"), t1_p3_pri = c("$75", 
"$75"), t2_p1_env = c("high_env", "mid_env"), t2_p1_eth = c("low_eth", 
"high_eth"), t2_p1_pri = c("$75", "$125"), t2_p2_env = c("mid_env", 
"low_env"), t2_p2_eth = c("mid_eth", "low_eth"), t2_p2_pri = c("$125", 
"$75"), t2_p3_env = c("mid_env", "high_env"), t2_p3_eth = c("mid_eth", 
"high_eth"), t2_p3_pri = c("$75", "$75"), t3_p1_env = c("high_env", 
"mid_env"), t3_p1_eth = c("high_eth", "mid_eth"), t3_p1_pri = c("$125", 
"$125"), t3_p2_env = c("mid_env", "high_env"), t3_p2_eth = c("low_eth", 
"low_eth"), t3_p2_pri = c("$25", "$25"), t3_p3_env = c("low_env", 
"low_env"), t3_p3_eth = c("high_eth", "high_eth"), t3_p3_pri = c("$25", 
"$75"), t4_p1_env = c("low_env", "high_env"), t4_p1_eth = c("low_eth", 
"low_eth"), t4_p1_pri = c("$75", "$125"), t4_p2_env = c("high_env", 
"mid_env"), t4_p2_eth = c("mid_eth", "mid_eth"), t4_p2_pri = c("$125", 
"$25"), t4_p3_env = c("low_env", "low_env"), t4_p3_eth = c("high_eth", 
"mid_eth"), t4_p3_pri = c("$25", "$125")), row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame"))

需求说明

已完成long数据集第一行对应的new_df内容填充,现在需要编写for()循环,将相同的处理逻辑应用到long的其余行,完成new_df剩余部分的填充,最终实现每行对应id的环境、伦理、价格列根据long中的选择标记为1(选中)或0(未选中)。

解决方案代码

# 遍历long的每一行
for (i in 1:nrow(long)) {
  # 获取当前行的id
  current_id <- long$id[i]
  # 定位new_df中对应id的所有行索引
  df_indices <- which(new_df$id == current_id)
  
  # 遍历4个时间点(t1到t4)
  for (t in 1:4) {
    # 计算当前时间点在new_df中的起始行位置
    start_row <- df_indices[(t-1)*3 + 1]
    # 获取当前时间点的选中选项
    chosen_col <- paste0("t", t, "_choice")
    choice_val <- as.integer(long[[chosen_col]][i])
    
    # 遍历当前时间点的3个选项(p1到p3)
    for (p in 1:3) {
      # 计算当前选项在new_df中的行索引
      current_row <- start_row + p - 1
      # 获取当前选项对应的环境、伦理、价格列名
      env_col <- long[[paste0("t", t, "_p", p, "_env")]][i]
      eth_col <- long[[paste0("t", t, "_p", p, "_eth")]][i]
      pri_col <- case_when(
        long[[paste0("t", t, "_p", p, "_pri")]][i] == "$25" ~ "low_pri($25)",
        long[[paste0("t", t, "_p", p, "_pri")]][i] == "$75" ~ "mid_pri($75)",
        TRUE ~ "high_pri($125)"
      )
      
      # 标记选中状态:选中的选项对应列设为1,未选中设为0
      new_df[current_row, env_col] <- ifelse(p == choice_val, 1, 0)
      new_df[current_row, eth_col] <- ifelse(p == choice_val, 1, 0)
      new_df[current_row, pri_col] <- ifelse(p == choice_val, 1, 0)
    }
  }
}

# 查看填充后的结果
print(new_df)

结果说明

运行上述代码后,new_df中每个id对应的12行(4个时间点×3个选项)会根据long数据集中的选择记录,自动将对应环境、伦理、价格列标记为1,未选中的选项对应列标记为0,与预期结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:00:55