R语言循环匹配数据框 为列表子表添加对应评分值不匹配问题
问题场景
- 评分主表
df1:列对应不同参与者,行名为Pic-ID(图片唯一标识),存储每位参与者对所有图片的评分数据 - 待处理列表
list_of_df:包含155个子数据框,每个子数据框记录当前轮次用到的图片Pic-ID,需要将df1中对应参与者、对应图片的评分,匹配写入每个子数据框的rating列
初始编写的双层循环代码如下:
for (t in 1:155) { for (j in sort(rep(1:31, 5))) { list_of_df[[t]]$rating <- df1[list_of_df[[t]]$picture_ID, j] } }
代码运行时未抛出任何报错,但对比df1原始评分和列表子数据框的rating列时,发现数值完全无法正确对应。以下是可复现问题的简化测试代码:
df1 <- data.frame(picID = c("pic1", "pic2", "pic3", "pic4", "pic5", "pic6"), sub1 = c(6, 15, 87, 4, 22, 56), sub2 = c(77, 41, 3, 54, 28, 43)) rownames(df1) <- df1$picID df1$picID <- NULL sub1_1 <- data.frame(picID = c("pic3", "pic4")) sub1_1 <- cbind(sub1_1, "rating" = NA) sub1_2 <- data.frame(picID = c("pic6", "pic1")) sub1_2 <- cbind(sub1_2, "rating" = NA) sub1_3 <- data.frame(picID = c("pic2", "pic5")) sub1_3 <- cbind(sub1_3, "rating" = NA) sub2_1 <- data.frame(picID = c("pic2", "pic1")) sub2_1 <- cbind(sub2_1, "rating" = NA) sub2_2 <- data.frame(picID = c("pic4", "pic6")) sub2_2 <- cbind(sub2_2, "rating" = NA) sub2_3 <- data.frame(picID = c("pic5", "pic3")) sub2_3 <- cbind(sub2_3, "rating" = NA) list_of_df <- list(sub1_1, sub1_2, sub1_3, sub2_1, sub2_2, sub2_3) for (t in 1:6) { for (j in sort(rep(1:2, 3))) { list_of_df[[t]]$rating <- df1[list_of_df[[t]]$picID, j] } }
错误原因
双层循环的逻辑存在本质问题:
- 外层循环固定一个
t(即固定一个子数据框)时,内层的j会遍历完所有参与者列,每次遍历都会直接覆盖重写整个rating列 - 最终每个子数据框的
rating只会保留内层循环最后一个j对应的评分值,完全无法实现“每5个子数据框对应1个参与者列”的匹配逻辑。比如简化示例中每个子数据框都会被j=1、j=2两次赋值,最后全部保留j=2(即sub2)的评分,自然和预期结果不符。
修复方法
不需要双层嵌套循环,提前生成和列表长度一一对应的参与者列索引序列,单次循环即可完成匹配:
- 按照“每个参与者对应N个子数据框”的规律,生成和列表顺序完全匹配的列索引序列
- 单次遍历列表,每个子数据框直接取对应索引的参与者列,按Pic-ID匹配评分即可
简化测试场景的修复代码:
# 2个参与者,每个参与者对应3个子数据框,按顺序生成列索引 j_seq <- rep(1:2, each = 3) for (t in seq_along(list_of_df)) { current_col <- j_seq[t] list_of_df[[t]]$rating <- df1[list_of_df[[t]]$picID, current_col] }
原始155个数据框场景的修复代码:
# 31个参与者,每个参与者对应5个子数据框,按顺序生成列索引 j_seq <- rep(1:31, each = 5) for (t in seq_along(list_of_df)) { current_col <- j_seq[t] list_of_df[[t]]$rating <- df1[list_of_df[[t]]$picture_ID, current_col] }
修复后可随机抽样验证:第一个子数据框sub1_1中pic3、pic4的评分为87、4,和df1中sub1的对应评分完全一致;第四个子数据框sub2_1中pic2、pic1的评分为41、77,和df1中sub2的对应评分完全一致。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

