使用R生成n个唯一名称

时间:2015-06-24 01:16:50

标签: r

我想使用R生成n个唯一名称。这是我现在的代码:

library(randomNames)
set.seed(6232015)
gen.names <- function(n){
  while(n>0){ 
    names <- unique(randomNames(n=n))
    n <- n - length(names)
    names2 <- c(unique(randomNames(n=n)), names)
    n <- n - length(names2)
    }
  return(names2)
  }
nombres<- gen.names(n = 40000)

而不是40000我得到39999.如果我要求少于40000我得到那个号码。我的代码出了什么问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

您在第二次通话中获得了非唯一名称,导致姓名丢失。然后n计算被打破,允许你离开while循环。

让我们一起来看看:

names <- unique(randomNames(n=n))
n <- n - length(names)

你有38986个唯一的名字,n现在是1014

现在:

names2 <- c(unique(randomNames(n=n)), names)
n <- n - length(names2)

您有1013个新的唯一名称,在名称2中总名称为39999,n现在为1014 - 39999 = -38985

您点击循环结束,并在小于1时退出,并以1缺少名称返回您的值。

这是一个hacky解决方案,产生2000个额外名称,然后检查循环:

gen.names <- function(n){
  names<-c()
  while(length(names)<n){ 
    names <- unique(c(randomNames(n=n+2000),names))
  }
  return(names[1:n])
}

答案 1 :(得分:0)

谢谢@jeremycg!

阅读完答案后,这是我的解决方案:

set.seed(6232015)
gen.names <- function(n){
  names <- unique(randomNames(n=n))
  need <- n - length(names)
  while(need>0){ 
    names <- unique(c(randomNames(n=need), names))
    need <- n - length(names)
    }
  return(names)
  }
nombres<- gen.names(n = 100000)