如何在dplyr中通过字符串向量选择列计算逐行最大值
问题原因
你遇到的invalid argument to unary operator报错,本质是直接把存储列名的字符串向量传给pmax()时,dplyr不会自动将其识别为数据框的列引用,只会把它当成普通的字符向量处理,pmax作用于字符向量返回的是字符串比较结果,自然无法加负号。你之前使用all_of()没有生效,是因为没有配合dplyr的行向运算语法使用。
同时后续ladder.channel + correction的写法也会报错,同样是因为ladder.channel是字符串,不是数据框的列值。
可行解决方案
方案1:rowwise行向运算(可读性高,适合中小数据量)
这是dplyr官方推荐的行聚合写法,配合c_across和all_of实现字符串向量选列:
library(dplyr) ladder.channel <- c("channel_4") bleed.channels <- c("channel_1", "channel_2", "channel_3", "channel_5") y <- x %>% # 开启行向计算模式 rowwise() %>% mutate( # c_across搭配all_of选中所有目标列,计算行最大值 correction = -max(c_across(all_of(bleed.channels))), # .data[[列名字符串]]是用字符串取单列的标准写法 channel.corr = .data[[ladder.channel]] + correction ) %>% # 关闭行向分组,避免影响后续数据操作 ungroup()
方案2:do.call调用pmax(性能更高,适合大数据量)
等效于手动把所有列名作为参数传给pmax,不需要转成行向格式:
y <- x %>% mutate( correction = -do.call(pmax, .[bleed.channels]), channel.corr = .[[ladder.channel]] + correction )
核心语法说明
all_of()用来严格匹配字符串向量中的列名,列不存在时会直接抛出明确的缺失报错,避免非预期的静默匹配.data[[列名]]是dplyr标准的字符串取列语法,完全兼容dplyr的非标准求值规则,不会出现列识别失败的问题do.call(pmax, 列列表)会把列表里的所有列作为独立参数传给pmax,等效于手动书写pmax(channel_1, channel_2, channel_3, channel_5)
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

