R语言中识别列内匹配字符串并生成对应编号新列的方法
解决方案
当然可以!在R里有多种简洁高效的方法能实现这个需求——给每个唯一的description值分配对应的唯一编号,哪怕你的数据里有大量唯一值也完全没问题。下面是几个常用的方案,结合你的示例数据演示:
首先先构造你的示例tibble:
library(tibble) library(dplyr) # 你的示例数据 df <- tibble( block = c(1,1,1,1,1,2,2), description = c("enroll", "enroll", "motivated", "motivated", "motivated", "openemail", "openemail") )
方法1:利用因子转整数(最直观)
通过将description转为因子,再把因子的水平转为整数,就能快速得到唯一编号:
df <- df %>% mutate(desc_id = as.integer(factor(description, levels = unique(description))))
- 这里
levels = unique(description)确保编号按照description首次出现的顺序生成;如果不需要这个顺序,去掉该参数即可,默认会按字母顺序分配编号。
方法2:分组后获取组ID(tidyverse风格)
用dplyr的分组功能,直接为每个分组分配唯一ID:
df <- df %>% group_by(description) %>% mutate(desc_id = cur_group_id()) %>% ungroup()
这个方法代码更语义化,分组后每个description组对应一个唯一ID,顺序和分组的顺序一致。
方法3:Base R原生方法(无需加载包)
如果不想加载额外包,用match()函数就能实现:
df$desc_id <- match(df$description, unique(df$description))
match()会返回每个description元素在unique(df$description)向量中的位置,也就是对应的唯一编号,效率很高。
最终结果示例
执行上述任意方法后,你的tibble会变成这样:
df #> # A tibble: 7 × 3 #> block description desc_id #> <dbl> <chr> <int> #> 1 1 enroll 1 #> 2 1 enroll 1 #> 3 1 motivated 2 #> 4 1 motivated 2 #> 5 1 motivated 2 #> 6 2 openemail 3 #> 7 2 openemail 3
额外需求:自定义编号映射
如果需要给特定的description分配自定义编号(比如不是从1开始的连续数),可以先创建一个映射表,再通过左连接实现:
# 创建自定义映射表 desc_mapping <- tibble( description = c("enroll", "motivated", "openemail"), desc_id = c(101, 202, 303) # 自定义编号 ) # 左连接完成映射 df <- df %>% left_join(desc_mapping, by = "description")
内容的提问来源于stack exchange,提问作者melbez
相关产品推荐
相关产品推荐

