将名称列表转换为R中的整数标签

将名称列表转换为R中的整数标签,r,R,考虑以下列表 names = c("Bob", "Steve", "John", "Steve") 我想要一个函数,为每个唯一的名称返回一个整数 int_names = [1,2,3,2] 还有一本字典,这样我就可以回去查名字了 dict_names = ["Bob", "Steve", "John"] 我可以看到如何使用for循环来实现这一点,但我确信在R中肯定有更有效的方法来实现这一点。我认为这可能与因子有关,但我似乎只能使用它来获得int\u名称,而失去dict\u名称您可以使用un

考虑以下列表

names = c("Bob", "Steve", "John", "Steve")
我想要一个函数,为每个唯一的名称返回一个整数

int_names = [1,2,3,2]
还有一本字典,这样我就可以回去查名字了

dict_names = ["Bob", "Steve", "John"]

我可以看到如何使用for循环来实现这一点,但我确信在R中肯定有更有效的方法来实现这一点。我认为这可能与
因子有关,但我似乎只能使用它来获得
int\u名称
,而失去
dict\u名称

您可以使用
unique
match

 dict_names <- unique(names)
 int_names <- match(names, dict_names)

如果我理解正确,你可以通过给一个原子向量加上名字来得到它。不需要额外的功能

samplenames <- c("Bob", "Steve", "John","Steve")
thesenames <- unique(samplenames)
idx <- 1:length(thesenames)    
names(idx) <- thesenames

idx["Steve"]  # is 2
idx["John"]  # is 3

名称我不理解您的解决方案。如果OP有
set.seed(123);那么你需要一个额外的步骤,像这样。我不认为这是一个随机向量:
set.seed(123);samplenames好吧,我不明白问题的这一方面,我认为双重“Steve”是一个编辑错误。不过这个想法仍然有效。你知道match是否使用哈希表来匹配
match
函数吗?@MikeWise不,我不知道。
samplenames <- c("Bob", "Steve", "John","Steve")
thesenames <- unique(samplenames)
idx <- 1:length(thesenames)    
names(idx) <- thesenames

idx["Steve"]  # is 2
idx["John"]  # is 3
thesenames[1] # is "Bob"
thesenames[2] # is "Steve"
names <- c("Bob", "Steve", "John", "Steve")
names.factor <- as.factor(names)
names.integer <- as.integer(names.factor)
names.dict <- unique(cbind(names.factor,names))