如何在R语言中根据每行多列取值mutate生成新分类列?
R语言按行判断生成新列
示例数据框
toy.df <- data.frame(Name = c("group1", "group2", "group3", "group4", "group5", "group6", "group7"), col1 = c("pos", "neg", "NA", "pos","neg", "NA", "pos"), col2 = c("pos", "pos", "NA", "pos","neg","NA", "neg"), col3 = c("pos", "NA", "pos", "NA", "neg", "neg", "neg"))
需求说明
需要新增一列col4,判断规则如下:
- 若该行所有非NA值均为"pos",赋值"pos"
- 若该行所有非NA值均为"neg",赋值"neg"
- 若该行同时存在"pos"和"neg"(无论是否包含NA),赋值"both"
预期col4的取值为:
col4 <- c("pos", "both", "pos", "pos","neg", "neg","both")
解决方案
方法一:使用dplyr(tidyverse风格)
library(dplyr) toy.df <- toy.df %>% rowwise() %>% mutate( # 提取当前行col1-col3的非NA值 valid_vals = list(na.omit(c_across(col1:col3))), col4 = case_when( all(valid_vals == "pos") ~ "pos", all(valid_vals == "neg") ~ "neg", TRUE ~ "both" ) ) %>% ungroup() %>% select(-valid_vals) # 移除临时计算列
方法二:使用base R
# 按行遍历col1-col3,执行判断逻辑 toy.df$col4 <- apply(toy.df[, c("col1", "col2", "col3")], 1, function(row_vals) { cleaned_vals <- na.omit(row_vals) if (all(cleaned_vals == "pos")) { "pos" } else if (all(cleaned_vals == "neg")) { "neg" } else { "both" } })
最终结果
运行上述代码后,数据框如下:
Name col1 col2 col3 col4 1 group1 pos pos pos pos 2 group2 neg pos NA both 3 group3 NA NA pos pos 4 group4 pos pos NA pos 5 group5 neg neg neg neg 6 group6 NA NA neg neg 7 group7 pos neg neg both
内容的提问来源于stack exchange,提问作者say.ff
相关产品推荐
相关产品推荐

