R数据框按条件对指定列相乘出现维度异常与报错如何解决
R语言数据框条件赋值问题排查与解决
第一份代码输出尺寸异常问题
问题原因
ifelse()是逐元素返回结果的向量函数,返回值长度和你传入的判断条件长度一致。你给yes、no参数传入的是10列的数据框,R会自动将其降维为长向量,和判断条件循环匹配后返回的结果维度完全错乱,套入data.frame()后就生成了不符合预期的正方形宽表。
修正方案
直接用数据框行列索引做条件赋值,保留原数据结构:
# 定义目标修改列和行筛选条件 target_cols <- c("a_Pinene","Isoprene","Methyl_Vinyl_Ketone","Nopinone","Benzene_", "D_Limonene", "Sabinene","a_Cedrene","Pentane","Hexane") filter_cond <- slopejoin$tdiff == 2 & slopejoin$date >= "2021-01-30" & slopejoin$date <= "2021-08-08" # 直接对符合条件的子集赋值 slopejoin[filter_cond, target_cols] <- slopejoin[filter_cond, target_cols] * 0.85
第二份代码类型报错问题
问题原因
你混淆了行筛选和列选择的语法规则:行筛选条件需要放在逗号前,列选择放在逗号后,两类逻辑不能混在一起运算。你在列索引位置写的cols & slopejoin$substr != z中,cols是存储列名的字符向量,和slopejoin$substr != z返回的行逻辑向量做&运算,两类不兼容类型运算直接触发报错。
修正方案
把substr的判断条件放到行筛选逻辑中,列索引直接用定义好的列名字符向量:
cols <- c("a_Pinene","Isoprene","Methyl_Vinyl_Ketone", "Nopinone","Benzene_", "D_Limonene", "Sabinene","a_Cedrene","Pentane","Hexane") x <- "2021-01-06" y <- "2021-08-08" z <- 'zero_VOC_2' # 所有行筛选条件统一放在逗号前 row_cond <- slopejoin$tdiff == 2 & slopejoin$date >= x & slopejoin$date <= y & slopejoin$substr != z slopejoin[row_cond, cols] <- slopejoin[row_cond, cols] * 0.06
补充注意:如果
date列为字符类型,建议先转成Date类再做比较,避免字符串排序的隐性问题:slopejoin$date <- as.Date(slopejoin$date)
内容的提问来源于stack exchange,提问作者DFM-1124
相关产品推荐
相关产品推荐

