如何在R语言DataFrame中标记新序列开始的首行
解决方案
基础R实现
直接利用duplicated()函数判断Number列是否为首次出现,结合ifelse()生成标记列:
# 新增标记列 df$first <- ifelse(!duplicated(df$Number), "yes", "no") # 查看结果 df #> Number Day Letter first #> 1 1 1 a yes #> 2 1 2 a no #> 3 1 3 a no #> 4 1 4 a no #> 5 2 1 b yes #> 6 2 2 b no #> 7 2 3 b no #> 8 2 4 b no
tidyverse(dplyr)实现
如果习惯使用tidyverse生态,用dplyr::mutate()结合duplicated()或行号对比都可以实现:
library(dplyr) # 方法1:利用duplicated快速判断 df_des <- df %>% mutate(first = if_else(!duplicated(Number), "yes", "no")) # 方法2:通过行号与前一行对比(适用于更复杂的序列场景) df_des <- df %>% mutate(first = if_else(row_number() == 1 | Number != lag(Number), "yes", "no")) # 查看结果 df_des #> Number Day Letter first #> 1 1 1 a yes #> 2 1 2 a no #> 3 1 3 a no #> 4 1 4 a no #> 5 2 1 b yes #> 6 2 2 b no #> 7 2 3 b no #> 8 2 4 b no
扩展说明
如果序列的分组依据是多列(比如同时按Number和Letter分组),只需调整duplicated()的参数为对应列组合即可:
# 多列分组的序列起始标记 df$first <- ifelse(!duplicated(df[c("Number", "Letter")]), "yes", "no")
内容的提问来源于stack exchange,提问作者Daniel AG
相关产品推荐
相关产品推荐

