1

長い投稿を前もって申し訳ありません。

forループを使用してこれをなんとか克服しましたが、sqldfの方が効率的であると感じていますが、今のところうまくいきません。

最初のデータ フレームには一意の識別子 (名前) があります。これは 1000x5 のようなものですが、この精神では:

Name <- c('Ben','Gary','John','Michael')
Age  <- c(13,20,5,57)
dfA  <- as.data.frame(cbind(Name,Age))

dfA
>        Name Age
>   1     Ben  13
>   2    Gary  20
>   3    John   5
>   4 Michael  57

私の 2 番目のデータ フレームには一意のキーがありません。これも 5000x5 ですが、通常は次のようになります。

Name   <- c('Ben','Ben','Ben','Gary','Michael','Michael','Michael')
Color  <- c('Blue','Red','Green','Red','Yellow','Yellow','Black')
Other.Entries <- c('180','200','150','100','70','200','130')
dfB   <- as.data.frame(cbind(Name,Color))

dfB
>     Name  Color  Other_Entries(not.related)
>1     Ben   Blue   180
>2     Ben    Red   180
>3     Ben  Green   150
>4    Gary    Red   100
>5 Michael Yellow   70
>6 Michael Yellow   200
>7 Michael  Black   130

各名前の色には冗長性があり、すべての名前が表示されるわけではないことに注意してください。

私の望ましい出力は次のとおりです。

  1. データ フレーム B の各名前の色を取得します (冗長性を削除します。おそらくアルファベット順にします)。

  2. これらのいくつかの色を文字列に変換します (たとえば、関数 "toString" を使用して)

  3. 最初のデータ フレームに文字列を新しいエントリとして追加します。

最初に for ループを使用したとき、このような空の列を持つ新しいデータ フレームを作成しました

dfCombined <- dfA
dfCombined["Color"] <- NA

.. 2 番目のデータ フレームからクエリを実行して、すべての行を反復処理します。

しかし、おそらくこれは、何か賢いものを使用する必要がないかもしれません.

最終結果は次のようになります。

dfCombined
>     Name Age    Color
>1     Ben  13   Blue, Green, Red
>2    Gary  20   Red
>3    John   5
>4 Michael  57   Black, Yellow

助言がありますか?

4

2 に答える 2

2

1a)複数のステートメントを含むsqldfこれを試してください:

library(sqldf)

dfB_s <- sqldf("select distinct * from dfB order by Name, Color")
dfB_g <- sqldf("select Name, group_concat(Color) Color 
                from  dfB_s
                group by Name")
sqldf("select * 
       from dfA 
       left join dfB_g using (Name)")

1b) 1 つのステートメントまたはオールインワンの sqldf :

sqldf("select * 
       from dfA
       left join
             (select Name, group_concat(Color) Color 
             from 
                 (select distinct * from dfB order by Name, Color)
             group by Name)
       using (Name)")

これらのいずれかが与えます:

     Name Age          Color
1     Ben  13 Blue,Green,Red
2    Gary  20            Red
3    John   5           <NA>
4 Michael  57   Black,Yellow

2) パッケージなし sqldf なしでは、次のようになります。

dfB_s <- unique(dfB)[order(dfB$Name, dfB$Color), ]
dfB_g <- aggregate(Color ~ Name, dfB_s, toString)
merge(dfA, dfB_g, all.x = TRUE, by = "Name")

3) data.table速度が問題になる場合は、data.table を試してみてください。

library(data.table)

unique(data.table(dfB, key = "Name,Color"))[
           , toString(Color), by = Name][
           data.table(dfA)]

与える:

      Name               V1 Age
1:     Ben Blue, Green, Red  13
2:    Gary              Red  20
3:    John               NA   5
4: Michael    Black, Yellow  57

4) dplyrであり、ここに dplyr ソリューションがあります:

ライブラリ(dplyr)

dfA %.% 
   left_join(dfB %.%
                 unique() %.%
                 arrange(Name, Color) %.% 
                 group_by(Name) %.% 
                 summarise(Color = toString(Color)))

他のソリューションを追加しました。いくつかのエラーを修正しました。

于 2014-05-05T14:20:41.333 に答える
0

バッチ処理するには、実際のコードでこれを行います。疑似コード: カラー配列ロード配列変数の名前 run while ループ:$array = array("foo", "bar", "hello", "world"); var_dump($配列); 名前ごとに新しいテーブルへの挿入を実行します。

于 2014-05-05T00:14:11.650 に答える