2010-07-17 6 views
7

Довольно простой вопрос о производительности от R новичка. Я хотел бы присвоить идентификатор группы каждой строке в кадре данных уникальными комбинациями полей. Вот мой текущий подход:Присвоение идентификатора группы с помощью ddply

> # An example data frame 
> df <- data.frame(name=c("Anne", "Bob", "Chris", "Dan", "Erin"), 
        st.num=c("101", "102", "105", "102", "150"), 
        st.name=c("Main", "Elm", "Park", "Elm", "Main")) 
> df 
    name st.num st.name 
1 Anne 101 Main 
2 Bob 102  Elm 
3 Chris 105 Park 
4 Dan 102  Elm 
5 Erin 150 Main 
> 
> # A function to generate a random string 
> getString <- function(size=10) return(paste(sample(c(0:9, LETTERS, letters), size, replace=TRUE), collapse='')) 
> 
> # Assign a random string for each unique street number + street name combination 
> df <- ddply(df, 
       c("st.num", "st.name"), 
       function(x) transform(x, household=getString())) 
> df 
    name st.num st.name household 
1 Anne 101 Main 1EZWm4BQel 
2 Bob 102  Elm xNaeuo50NS 
3 Dan 102  Elm xNaeuo50NS 
4 Chris 105 Park Ju1NZfWlva 
5 Erin 150 Main G2gKAMZ1cU 

В то время как это работает хорошо для кадров данных с относительно небольшим числом строк или небольшого числа групп, я бегу в проблемы производительности с большими наборами данных (> 100000 строк), которые имеют много уникальных групп.

Любые предложения по улучшению скорости выполнения этой задачи? Возможно, с экспериментальным идентификатором plyr.frame()? Или я все об этом ошибаюсь?

Заранее за вашу помощь.

ответ

14

Попробуйте использовать функцию id (также в plyr):

df$id <- id(df[c("st.num", "st.name")], drop = TRUE) 

Update:

id функция считается устаревшим, так как dplyr версии 0.5.0. Функция group_indices обеспечивает ту же функциональность.

+0

Очевидно, мне нужно вернуться назад и внимательно прочитать документацию plyr - это именно то, что я искал. Я оценил это решение и JoFrhwld в моем тестовом наборе данных: кадр данных с 164 961 наблюдением и 91 876 уникальных групп на основе трех переменных группировки. Я использовал каждый из этих методов для назначения переменной идентификатора группы 100 раз. Среднее прошедшее время для id() было .958 (sd .0310). Среднее прошедшее время для вставки полей группировки было 1,94 (sd .0946). Благодаря обоим! – danpelota

2

Нужно ли, чтобы идентификатор был случайной 10-символьной строкой? Если нет, почему бы не просто вставить столбцы кадра данных. Если идентификаторы должны быть одинаковой длины в символах преобразования факторов в цифровой, а затем вставить их вместе:

df$ID <- paste(as.numeric(df$st.num), as.numeric(df$st.name), sep = "") 

Тогда, если вам действительно нужно иметь 10 идентификаторов символов, я бы генерировать только п число идентификаторов и переименовывать уровни ID с ними

df$ID <- as.factor(df$ID) 
n <- nlevels(df$ID) 

getID <- function(n, size=10){ 
    out <- {} 
    for(i in 1:n){ 
    out <- c(paste(sample(c(0:9, LETTERS, letters), size, replace=TRUE), collapse='')) 
    } 
    return(out) 
} 

newLevels <- getID(n = n) 

levels(df$ID) <- newLevels 

Кроме того, как в сторону, вам не нужно использовать function(x) с ddply таким образом с transform(). Этот код будет работать точно так же:

ddply(df, c("st.num", "st.name"), transform, household=getString()) 

 Смежные вопросы

  • Нет связанных вопросов^_^