满足双条件时将列名拼接至新列的R语言实现问题
解决方法
你的代码报错核心问题是没有逐行处理数据:rowSums和paste(..., collapse=",")都是对整个列操作,无法匹配每行的判断逻辑。以下是两种可行的修正方案:
方案一:用dplyr逐行处理(推荐)
# 假设cols是指定病毒列的名称向量,column_indices是对应的列索引 df <- df %>% rowwise() %>% mutate( # 提取当前行中阳性的病毒列名 pos_viruses = list(cols[c_across(all_of(column_indices)) == 1]), CoinfectionSpecified = ifelse( Influenza == 1 & length(pos_viruses) > 0, paste(pos_viruses, collapse = ","), NA_character_ ) ) %>% ungroup() %>% select(-pos_viruses) # 删除临时中间列
rowwise()强制dplyr逐行执行后续操作c_across(all_of(column_indices))获取当前行指定列的所有值- 用
list()保存每行的阳性病毒名,避免被自动压缩成向量
方案二:用apply逐行遍历
df$CoinfectionSpecified <- apply(df, 1, function(row) { # 先判断流感是否阳性 if (row["Influenza"] != 1) { return(NA_character_) } # 提取当前行指定列中阳性的病毒名 pos_viruses <- cols[row[column_indices] == 1] # 有阳性病毒则拼接,否则返回NA if (length(pos_viruses) > 0) { paste(pos_viruses, collapse = ",") } else { NA_character_ } })
apply(df, 1, ...)遍历每一行,对每行单独处理- 逻辑分层更清晰,适合不习惯dplyr语法的场景
注意事项
- 确保
cols向量的顺序和column_indices完全对应,避免列名匹配错误 - 如果数据中有NA值,需要在判断时加入
!is.na()(比如row[column_indices] == 1 & !is.na(row[column_indices]))
内容的提问来源于stack exchange,提问作者Savannah
相关产品推荐
相关产品推荐

