7

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()で?それとも私はこれについてすべて間違っていますか?

よろしくお願いします。

4

2 に答える 2

14

関数を使用してみてくださいid(これもplyrで):

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

アップデート:

このid関数は、dplyrバージョン0.5.0以降非推奨と見なされます。この関数group_indicesは同じ機能を提供します。

于 2010-07-18T13:05:07.250 に答える
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)、ddplyでそのように使用する必要はありませんtransform()。このコードはまったく同じように機能します。

ddply(df, c("st.num", "st.name"), transform, household=getString())
于 2010-07-17T20:57:12.003 に答える