在R中为选定列生成每行最大值对应列名的新列
问题解决方法
错误原因
你在子集数据时混合使用了列位置索引(7:29)和列名字符串,R会自动把数值型索引转换成字符串(比如把7变成"7"),相当于你在查找名为"7"、"8"的列,而非第7到29列,这才导致了"列不存在"的报错。
正确实现步骤
1. 先统一生成目标列名列表
先把第7到29列的列名提取出来,再和指定的三个列名合并,得到纯字符型的目标列名向量:
target_cols <- c(colnames(cdmx)[7:29], "coal_pri_pvem", "coal_prd_pt_nva_alianza", "coal_prd_pt")
2. 用dplyr方式生成winner列
使用across(all_of(target_cols))来正确引用目标列,再通过max.col找到每行最大值对应的列索引,最后从target_cols中取出对应列名:
library(dplyr) cdmx <- cdmx %>% mutate(winner = target_cols[max.col(across(all_of(target_cols)), ties.method = "first")])
3. 用Base R方式生成winner列
如果习惯用Base R,同样基于target_cols子集数据,再用apply逐行找最大值列:
cdmx$winner <- target_cols[apply(cdmx[target_cols], 1, function(x) which.max(x, na.rm = TRUE))]
额外验证技巧
可以先检查目标列是否都存在于数据框中,避免列名拼写错误:
# 输出0代表所有列都存在,大于0则说明有列名写错 sum(!target_cols %in% colnames(cdmx))
内容的提问来源于stack exchange,提问作者mr.questions
相关产品推荐
相关产品推荐

