如何在Excel或R中基于多变量生成唯一ID并避免重复?
在R Studio中生成唯一地块ID的解决方案
方案一:贴近手动格式的可读唯一ID
如果你想保留类似MT18MG3的可读格式,同时确保ID绝对不重复,可以按以下步骤实现:
- 加载数据处理工具包
library(tidyverse)
- 处理数据生成唯一ID
假设你的数据框包含farmer_name(农户姓名)、plot_name(地块名称)、area_ha(种植面积)三列,运行以下代码:
# 示例数据,替换成你的实际数据 farmers <- tibble( farmer_name = c("Mattern, Tobias", "Smith, John", "Mattern, Tobias"), plot_name = c("Mittelgewanne 3", "North Field 2", "Mittelgewanne 3"), area_ha = c(1.8, 2.5, 1.8) ) # 生成各部分缩写并拼接唯一ID farmers_processed <- farmers %>% # 提取农户姓名首字母(姓氏+名字) mutate(farmer_abbr = str_extract_all(farmer_name, "\\b[A-Z]") %>% map_chr(str_c, collapse = ""), # 处理面积:去掉小数点,补前导零保证两位(如0.9→09,1.8→18) area_abbr = str_replace(area_ha, "\\.", "") %>% str_pad(width = 2, side = "left", pad = "0"), # 提取地块缩写:单词首字母+末尾数字(如Mittelgewanne 3→MG3) plot_abbr = str_c(str_extract_all(plot_name, "\\b[A-Z]") %>% map_chr(str_c, collapse = ""), str_extract(plot_name, "\\d+$"))) %>% # 拼接基础ID mutate(base_id = str_c(farmer_abbr, area_abbr, plot_abbr)) %>% # 对重复的基础ID添加序号后缀,确保唯一 group_by(base_id) %>% mutate(unique_id = ifelse(n() == 1, base_id, str_c(base_id, row_number()))) %>% ungroup()
- 验证唯一性
运行以下代码确认没有重复ID:
any(duplicated(farmers_processed$unique_id))
返回FALSE则说明所有ID唯一。
方案二:绝对唯一的哈希ID
如果不需要可读格式,追求100%无重复,可使用哈希函数生成ID:
- 加载哈希工具包
library(digest) library(tidyverse)
- 生成哈希ID
farmers %>% mutate(unique_id = str_c(farmer_name, plot_name, area_ha, sep = "|") %>% digest(algo = "md5"))
这种方法通过将三个字段拼接后生成MD5哈希值,只要字段组合唯一,哈希ID就绝对唯一。
内容的提问来源于stack exchange,提问作者Isaac_v
相关产品推荐
相关产品推荐

