如何在R中基于现有病毒检测列生成阳性病毒组合新列?
解决方案:在R中生成阳性病毒组合列
以下提供两种实用方法,帮你快速生成按字母排序的阳性病毒组合列:
方法一:使用tidyverse(dplyr)
适合习惯dplyr语法的用户,通过rowwise()实现逐行处理:
library(dplyr) # 替换为你的实际病毒列名,比如FLUA、FLUB、RSV等 virus_cols <- c("FLUA", "FLUB", "RSV", "ADENO", "PIV1", "PIV2", "PIV3", "HRV", "HMPV", "OC43") df1 <- df %>% rowwise() %>% mutate( virus_combinations = { # 筛选当前行值为1的病毒列名 positive_viruses <- virus_cols[c_across(all_of(virus_cols)) == 1] # 按字母排序后用逗号连接 paste(sort(positive_viruses), collapse = ", ") } ) %>% ungroup()
关键说明:
rowwise():让mutate对每行单独计算,而非整列批量处理c_across(all_of(virus_cols)):精准选中指定的病毒列,获取当前行的所有检测值- 先筛选阳性病毒名,再排序后拼接,确保结果严格按字母顺序排列
方法二:使用基础R(apply函数)
无需加载额外包,适合轻量需求:
# 同样替换为你的病毒列名 virus_cols <- c("FLUA", "FLUB", "RSV", "ADENO", "PIV1", "PIV2", "PIV3", "HRV", "HMPV", "OC43") # 逐行处理病毒列,生成组合字符串 df$virus_combinations <- apply(df[virus_cols], 1, function(row_data) { positive_viruses <- names(row_data)[row_data == 1] paste(sort(positive_viruses), collapse = ", ") })
原代码问题解析:
你之前的代码错误在于:mutate默认按列操作,无法直接用names[value == 1]获取当前行的阳性列名。必须通过逐行处理(rowwise或apply)才能针对每行筛选对应的阳性病毒名称。
内容的提问来源于stack exchange,提问作者jcijac89
相关产品推荐
相关产品推荐

