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

如何按type列的不同值为样本行添加single/double/none标签

R语言按样本分组添加标签的实现方案

问题描述

原始数据集代码:

sample <- c("sample1", "sample1", "sample2", "sample2", "sample3", "sample3", "sample4", "sample4")
value1<- c(1, 5, 7, NA, NA, 3, 2, 1)
type <- c("x", "x", "y", "y", "x", "y", NA, NA)
myinput <- data.frame(sample, value1, type)

原始数据输出:

sample value1 type
1 sample1      1    x
2 sample1      5    x
3 sample2      7    y
4 sample2     NA    y
5 sample3     NA    x
6 sample3      3    y
7 sample4      2 <NA>
8 sample4      1 <NA>

需求:按sample分组,根据type列的取值情况添加label列,规则如下:

  • 仅含一个值(仅x或仅y,不同时包含)→ single
  • 含两个值(同时有x和y,无NA)→ double
  • 全为NA值→ none

已知数据集中不存在同时包含x/y与NA的样本,期望输出:

sample value1 type label
1 sample1      1    x single
2 sample1      5    x single
3 sample2      7    y single
4 sample2     NA    y single
5 sample3     NA    x double
6 sample3      3    y double
7 sample4      2 <NA>   none
8 sample4      1 <NA>   none

解决方案

方法一:使用dplyr包(简洁易读)

library(dplyr)

myinput <- myinput %>%
  group_by(sample) %>%
  mutate(
    # 提取当前组非NA的type唯一值作为临时判断依据
    unique_type = list(na.omit(unique(type))),
    label = case_when(
      length(unique_type[[1]]) == 0 ~ "none",
      length(unique_type[[1]]) == 1 ~ "single",
      length(unique_type[[1]]) == 2 ~ "double"
    )
  ) %>%
  select(-unique_type) # 删除临时辅助列

方法二:基础R实现(无需额外依赖)

# 按sample分组,获取每个组的非NA唯一type值
type_groups <- tapply(myinput$type, myinput$sample, function(x) na.omit(unique(x)))

# 生成每个样本对应的标签
labels <- sapply(type_groups, function(x) {
  len <- length(x)
  if (len == 0) {
    "none"
  } else if (len == 1) {
    "single"
  } else {
    "double"
  }
})

# 将标签匹配到原始数据框
myinput$label <- labels[myinput$sample]

核心逻辑说明

两种方法的核心思路一致:

  1. 按sample分组,提取每组中去重且非NA的type值;
  2. 根据提取结果的长度判断标签:
    • 长度为0 → 组内全是NA → none
    • 长度为1 → 组内只有x或y → single
    • 长度为2 → 组内同时有x和y → double

内容的提问来源于stack exchange,提问作者Nereus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:35:31