R语言中提取指定列非零值列名到新列(排除trtmt列)
解决方法
报错原因说明
你用names(.[R:B])报错是因为**R:B会被R解释为列的位置索引(而非列名字母顺序)**,如果你的R列和B列在数据框中的位置跨度超过实际列数(比如你数据只有14列,但R列是第15列之后的位置),就会触发"无法子集超出范围的列"的错误。
正确代码示例
要精准提取R、V、B三列中值>0的列名,你需要明确指定目标列,避免用位置索引的冒号写法。下面是两种可行的dplyr方案:
方案1:用rowwise() + c_across()
library(dplyr) # 假设你的数据集名为df df <- df %>% rowwise() %>% mutate( key2 = paste0( # 明确选中R、V、B三列并取列名 names(select(cur_data(), R, V, B))[ # 逐行判断这三列的值是否>0,生成索引 c_across(R, V, B) > 0 ], collapse = "" ) ) %>% ungroup()
方案2:用purrr::pmap_chr(无需rowwise)
library(dplyr) library(purrr) df <- df %>% mutate( key2 = pmap_chr( # 仅传入R、V、B三列的数据 select(., R, V, B), ~ { # 对应列名向量 target_cols <- c("R", "V", "B") # 筛选值>0的列名并拼接 paste0(target_cols[c(...) > 0], collapse = "") } ) )
为什么之前会包含trtmt列?
之前的代码意外包含trtmt列,是因为你用的c_across(R:B)不小心覆盖了trtmt列所在的位置区间,导致判断范围包含了trtmt列。上面的两种方案都精准限定了只处理R、V、B三列,不会涉及其他列。
内容的提问来源于stack exchange,提问作者hnguyen
相关产品推荐
相关产品推荐

