如何用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
相关产品推荐
相关产品推荐

