来自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 回答
尝试使用
id
函数(也在plyr中):Update:
自dplyr版本0.5.0起,
id
函数被视为已弃用 . 函数group_indices
提供相同的功能 .ID必须是随机的10个字符串吗?如果没有,为什么不将数据框的列粘贴在一起 . 如果ID必须与字符长度相同,请将因子转换为数字,然后将它们粘贴在一起:
然后,如果你真的需要10个字符ID,我只生成n个ID,并用它们重命名ID的级别
另外,作为一个旁白,您不需要使用
function(x)
与ddply一起使用transform()
. 这段代码的工作方式是一样的: