You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:37:31