web-dev-qa-db-ja.com

一意の識別子による集計および関連する値の文字列への連結

aggregateまたはreshapeで満足できると思う必要がありますが、わかりません。

名前のリスト(brand)とそれに付随するID番号(id)があります。このデータは長い形式であるため、名前には複数のIDを含めることができます。名前(brand)で非重複化し、複数の可能なidをコメントで区切られた文字列に連結したいと思います。

例えば:

brand            id 
RadioShack       2308
Rag & Bone       4466
Ragu             1830
Ragu             4518
Ralph Lauren     1638
Ralph Lauren     2719
Ralph Lauren     2720
Ralph Lauren     2721
Ralph Lauren     2722 

になるはずです:

RadioShack       2308
Rag & Bone       4466
Ragu             1830,4518
Ralph Lauren     1638,2719,2720,2721,2722

どうすればこれを達成できますか?

51
roody

Data.frame DFを呼び出しましょう

> aggregate(id ~ brand, data = DF, c)
         brand                           id
1   RadioShack                         2308
2   Rag & Bone                         4466
3         Ragu                   1830, 4518
4 Ralph Lauren 1638, 2719, 2720, 2721, 2722

aggregateを使用する別の方法は次のとおりです。

result <- aggregate(id ~ brand, data = DF, paste, collapse = ",")

これにより同じ結果が得られ、idlistではなくなりました。 @Frankコメントに感謝します。各列のclassを確認するには、次を試してください。

> sapply(result, class)
      brand          id 
   "factor" "character"

コメントで@DavidArenburgが言及したように、別の代替方法はtoString関数を使用することです:

aggregate(id ~ brand, data = DF, toString)
59
Jilber Urbina

data.tableのきれいな1行

library(data.table)
setDT(DF)

2つのオプション:

リストとしての結果

DF[ , .(id = list(id)), by = brand]
          brand                       id
1:   RadioShack                     2308
2:   Rag & Bone                     4466
3:         Ragu                1830,4518
4: Ralph Lauren 1638,2719,2720,2721,2722
> 

文字列として結果

DF[ , .(id = paste(id, collapse=",")), by = brand]
          brand                       id
1:   RadioShack                     2308
2:   Rag & Bone                     4466
3:         Ragu                1830,4518
4: Ralph Lauren 1638,2719,2720,2721,2722

注意

2つの結果が表示されますが同じ(つまり、印刷すると同じに見えます)でも、実際には非常に異なっており、さまざまな機能を許可します。

つまり、リストオプション(最初のオプション)を使用すると、元のidsに対して関数を実行できます。

後者を使用すると、情報をより簡単に表示できます(CSVまたはExcelへのエクスポートを含む)が、idを操作するには、それらをスプライシングする必要があります。

37
Ricardo Saporta

または dplyr を使用:

library(dplyr)
DF %>%
  group_by(brand) %>%
  summarise(id = paste(id, collapse = ","))

DFは、data.frameの名前です。

22
Sam Firke

ベースRの情報は次のとおりです。

_myby <- by(df$id,df$brand,function(x)paste(x,collapse=","))
_

「by」オブジェクトのフォーマットは奇妙です。 data.frame(id=c(myby))を使用すると、ブランドが行名になります。

_#                                    id
# RadioShack                       2308
# Rag & Bone                       4466
# Ragu                        1830,4518
# Ralph Lauren 1638,2719,2720,2721,2722
_

あるいは、_data.table_パッケージをロードすると、これは機能します:

_dt <- data.table(df)
dt[,paste(id,collapse=","),by=brand]
#           brand                       V1
# 1:   RadioShack                     2308
# 2:   Rag & Bone                     4466
# 3:         Ragu                1830,4518
# 4: Ralph Lauren 1638,2719,2720,2721,2722
_
10
Frank