使用ddply分配组ID

时间:2010-07-17 20:26:44

标签: r plyr

来自R新手的非常基本的表现问题。我想通过唯一的字段组合为数据框中的每一行分配一个组ID。这是我目前的做法:

> # 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

虽然这适用于行数相对较少或组数较少的数据帧,但我遇到了包含许多唯一组的较大数据集(> 100,000行)的性能问题。

有什么建议可以提高这项任务的速度吗?可能与plyr的实验性idata.frame()?或者我是不是错了?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:14)

尝试使用id功能(也在plyr中):

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

<强>更新

自dplyr版本0.5.0起,id函数被视为已弃用。 函数group_indices提供相同的功能。

答案 1 :(得分:2)

ID必须是随机的10个字符串吗?如果没有,为什么不将数据框的列粘贴在一起。如果ID必须与字符长度相同,请将因子转换为数字,然后将它们粘贴在一起:

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

然后,如果你真的需要10个字符的ID,我只生成n个ID,并用它们重命名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)之外,您不需要将transform()与ddply一起使用。这段代码的工作原理相同:

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