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
どうすればこれを達成できますか?
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 = ",")
これにより同じ結果が得られ、id
はlist
ではなくなりました。 @Frankコメントに感謝します。各列のclass
を確認するには、次を試してください。
> sapply(result, class)
brand id
"factor" "character"
コメントで@DavidArenburgが言及したように、別の代替方法はtoString
関数を使用することです:
aggregate(id ~ brand, data = DF, toString)
data.table
のきれいな1行
library(data.table)
setDT(DF)
リストとしての結果
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つの結果が表示されますが同じ(つまり、印刷すると同じに見えます)でも、実際には非常に異なっており、さまざまな機能を許可します。
つまり、リストオプション(最初のオプション)を使用すると、元のid
sに対して関数を実行できます。
後者を使用すると、情報をより簡単に表示できます(CSV
またはExcel
へのエクスポートを含む)が、id
を操作するには、それらをスプライシングする必要があります。
または dplyr を使用:
library(dplyr)
DF %>%
group_by(brand) %>%
summarise(id = paste(id, collapse = ","))
DF
は、data.frameの名前です。
ベース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
_