如何创建列判断组内成员是否坐连续座位?已尝试cumsum()和ave()未果
解决方案
要实现按组判断座位是否连续的需求,核心是先将字母座位转换为可量化的数值,再验证每组的数值序列是否为连续整数。以下是两种可行的R语言实现方法:
步骤1:构造示例数据
df <- data.frame( 组号 = c(1,1,1,2,2), 座位 = c("A","B","C","B","E") )
步骤2:实现连续判断
方法1:用dplyr包(直观易读)
library(dplyr) df <- df %>% # 将字母座位转为ASCII数值 mutate(座位数值 = utf8ToInt(座位)) %>% group_by(组号) %>% # 验证当前组的数值是否等于从最小值到最大值的连续序列 mutate(是否连续? = ifelse(all(座位数值 == min(座位数值):max(座位数值)), "Y", "N")) %>% ungroup() %>% select(-座位数值) # 可选:删除中间生成的数值列
方法2:用基础R的ave函数
如果不想依赖第三方包,用基础R即可实现:
# 转换座位为数值 df$座位数值 <- utf8ToInt(df$座位) # 按组判断连续性 df$是否连续? <- ave(df$座位数值, df$组号, FUN = function(x) { if (all(x == min(x):max(x))) "Y" else "N" }) # 删除中间辅助列 df$座位数值 <- NULL
最终结果
运行后得到的结果与你的预期输出完全一致:
| 组号 | 座位 | 是否连续? |
|---|---|---|
| 1 | A | Y |
| 1 | B | Y |
| 1 | C | Y |
| 2 | B | N |
| 2 | E | N |
逻辑说明
utf8ToInt()将字母转换为对应的ASCII编码(如"A"→65,"B"→66),把座位的字符关系转化为可计算的数值关系。- 对每组来说,若座位对应的数值序列刚好是从最小值到最大值的连续整数,说明座位是连续的;反之则不连续。
- 之前用
cumsum()未成功,大概率是逻辑未聚焦到序列完整性验证,此方法直接从连续序列的本质出发,更准确。
内容的提问来源于stack exchange,提问作者Ruser.1998
相关产品推荐
相关产品推荐

