如何在R语言中为有序数据框创建值首次出现标记列?
嘿,刚好碰到过类似的需求!因为你的数据已经按V1列排好序了,实现这个标记首次出现行的需求其实超简单,给你分享两种实用的方法:
方法一:Base R 原生实现(无需额外安装包)
用R自带的duplicated()函数就能搞定,逻辑很直观:
# 先构造你的示例数据 A <- data.frame(V1 = c(22, 27, 32, 32, 33, 33, 37), V2 = c(121, 243, 765, 322, 433, 435, 728)) # 新增V3列标记首次出现行 A$V3 <- ifelse(!duplicated(A$V1), "y", "n") # 查看结果,就是你要的目标格式 A
原理说明:duplicated(A$V1)会逐行检查当前V1的值是否在之前的行出现过,重复行返回TRUE,首次出现的行返回FALSE。我们用!取反后,再通过ifelse()把逻辑值转换成你需要的"y"/"n"标记。
方法二:tidyverse/dplyr 风格实现
如果你平时习惯用tidyverse系列工具,用dplyr的管道操作会更顺手:
library(dplyr) # 生成目标数据框B B <- A %>% mutate(V3 = case_when( !duplicated(V1) ~ "y", TRUE ~ "n" ))
或者更简洁的写法:
B <- A %>% mutate(V3 = ifelse(!duplicated(V1), "y", "n"))
原理说明:mutate()用来新增列,case_when()是dplyr里的多条件判断函数,这里同样利用duplicated()的结果来标记首次出现的行,逻辑和Base R方法完全一致,只是写法更贴合tidyverse的风格。
运行上述任意一种方法后,你都会得到和示例B完全一致的结果:
V1 V2 V3 1 22 121 y 2 27 243 y 3 32 765 y 4 32 322 n 5 33 433 y 6 33 435 n 7 37 728 y
内容的提问来源于stack exchange,提问作者erikfjonsson
相关产品推荐
相关产品推荐

