R语言使用sapply逐行处理列时如何引用同一行其他列的值
你的代码错误根源是:sapply仅遍历了Recentness data (# days)列的取值,自定义函数内拿到的x是该列的数值而非行号,你写rel$recentness_relative[x]时错误把数值x当成了行索引取值,因此得到异常结果。
方案1:基础R向量化运算(推荐,效率最高)
# 先初始化新列默认值为中间场景的计算结果 rel$recentness_new <- rel$recentness_relative * 5 # 替换x<42的行取值为0 rel$recentness_new[rel$`Recentness data (# days)` < 42] <- 0 # 替换x>364的行取值为5 rel$recentness_new[rel$`Recentness data (# days)` > 364] <- 5
方案2:dplyr包case_when实现(代码可读性更高)
library(dplyr) rel <- rel %>% mutate(recentness_new = case_when( `Recentness data (# days)` < 42 ~ 0, `Recentness data (# days)` > 364 ~ 5, TRUE ~ recentness_relative * 5 ))
方案3:按行遍历实现(仅做参考,大数据量下效率低于前两种)
如果需要保留分支判断的写法,改为遍历行号即可正确取到同行列值:
rel$recentness_new <- sapply(1:nrow(rel), function(row_idx) { x <- rel$`Recentness data (# days)`[row_idx] if (x < 42) { return(0) } else if (x > 364) { return(5) } else { return(rel$recentness_relative[row_idx] * 5) } })
内容的提问来源于stack exchange,提问作者Dorianeve
相关产品推荐
相关产品推荐

