如何按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]
核心逻辑说明
两种方法的核心思路一致:
- 按
sample分组,提取每组中去重且非NA的type值; - 根据提取结果的长度判断标签:
- 长度为0 → 组内全是NA →
none - 长度为1 → 组内只有x或y →
single - 长度为2 → 组内同时有x和y →
double
- 长度为0 → 组内全是NA →
内容的提问来源于stack exchange,提问作者Nereus
相关产品推荐
相关产品推荐

