2015-06-24 8 views
3

Я хочу, чтобы генерировать п уникальные имена, используя R. Это код, который я прямо сейчас:Генерация п уникальных имен с R

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, я получаю этот номер. Что не так в моем коде?

Спасибо!

+0

насчет п> 40000? вы получаете правильное количество предметов? С другой стороны, почему бы не попробовать «ПИСЬМА»? – Frash

+1

Если я установил n = 50000, я получу 49997 уникальных имен. Я не использую 'LETTERS', потому что мне нужны имена, а не случайные строки букв – Ignacio

ответ

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) 
1

Вы получаете уникальные имена во втором вызове, что приводит к потере имени. Затем вычисляется n вычислений, что позволяет оставить цикл while.

Давайте пройдем через него:

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

вы получили 38986 уникальные имена, п теперь 1014

Сейчас:

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

Вы получили 1013 новые уникальные имена, давая 39999 всего имена в именах2 и 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]) 
} 
Смежные вопросы