R语言dplyr分组后ifelse中用sum判断生成序列列异常如何解决?
问题原因及修正方案
错误原因
代码的问题出在ifelse函数的向量化匹配逻辑:
- 分组后
sum(newcol)>1是每组仅返回1个逻辑值(组内聚合结果) ifelse是向量化函数,要求判断条件、返回值的长度匹配,当判断条件长度为1时,会自动取返回值的第一个元素循环填充整个组的长度,所以出现了所有重复组的newcol都被替换为第一个元素1的异常结果。
另外用sum(newcol)>1判断组内是否有重复的逻辑也不够严谨,直接用n()获取组内行数判断是否大于1更准确高效。
修正方案
两种常用写法都可以实现需求:
写法1:替换ifelse为分组适用的if...else判断
library(dplyr) df1 %>% group_by(Fullname) %>% mutate(newcol = seq_along(Fullname)) %>% mutate(newcol = if(n() > 1) newcol else NA)
写法2:一步生成结果(更简洁)
library(dplyr) df1 %>% group_by(Fullname) %>% mutate(newcol = if(n() == 1) NA_integer_ else row_number())
运行后正确结果
# A tibble: 16 × 2 # Groups: Fullname [8] Fullname newcol <chr> <int> 1 Peter 1 2 Peter 2 3 Alison NA 4 Warren NA 5 Jack 1 6 Jack 2 7 Jack 3 8 Jack 4 9 Susan 1 10 Susan 2 11 Henry 1 12 Walison NA 13 Tinder 1 14 Peter 3 15 Henry 2 16 Tinder 2
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

