使用For循环与ifelse语句修改数据框列值的问题求助
问题修复建议
原代码的核心问题
你用错了ifelse的用法:ifelse是返回值的向量化函数,不是用来执行分支赋值的。你的写法里,两个赋值语句mess_new_03$time_trial_start <- mess_new_03$time和mess_new_03$time_trial_end <- mess_new_03$time会在ifelse计算参数时直接全部执行,不管条件真假,所以最终两列都会被time列的内容填充。
另外,R是向量化语言,完全不需要用for循环来做这种行级赋值,效率更低。
修复方案(推荐:向量化操作)
先初始化目标列为NA(避免残留值),再根据行索引的奇偶性直接批量赋值:
# 初始化目标列(如果之前未创建) mess_new_03$time_trial_start <- NA mess_new_03$time_trial_end <- NA # 奇数行索引:给time_trial_start赋值 mess_new_03$time_trial_start[row_index %% 2 != 0] <- mess_new_03$time[row_index %% 2 != 0] # 偶数行索引:给time_trial_end赋值 mess_new_03$time_trial_end[row_index %% 2 == 0] <- mess_new_03$time[row_index %% 2 == 0]
备选方案(如果一定要用循环)
把ifelse换成普通的if-else(因为循环里是单个标量索引,不需要向量化判断),同时注意只给当前行的对应列赋值:
# 初始化目标列 mess_new_03$time_trial_start <- NA mess_new_03$time_trial_end <- NA for (i in row_index) { if (i %% 2 != 0) { mess_new_03$time_trial_start[i] <- mess_new_03$time[i] } else { mess_new_03$time_trial_end[i] <- mess_new_03$time[i] } }
内容的提问来源于stack exchange,提问作者sa-al
相关产品推荐
相关产品推荐

