1

ツイートのフラット ファイルがあり、それらのプロパティをユーザーごとに集計したいと考えています。

例えば

user1, hashtag1, hashtag2 
user1, hashtag3, hashtag4 
user2, hashtag5, hashtag6 
user2, hashtag7, hashtag8

私が変身したいのは:

user1, hashtag1, hashtag2, hashtag3, hashtag4
user2, hashtag5, hashtag6, hashtag7, hashtag8 

これを行うエレガントな方法はありますか?

4

3 に答える 3

3

ユーザーごとのハッシュタグの数が常に同じでない限り、結果をリストに集約します。リストの各要素は、1 人のユーザーのハッシュタグの (おそらく可変長の) ベクトルになります。

# Read in your example data
df <- read.table(text="user1, hashtag1, hashtag2 
user1, hashtag3, hashtag4 
user2, hashtag5, hashtag6 
user2, hashtag7, hashtag8", sep=",", header=FALSE, stringsAsFactors=FALSE)


lapply(split(df[-1], df[1]), function(X) unname(unlist(X)))
# $user1
# [1] " hashtag1"  " hashtag3"  " hashtag2 " " hashtag4 "
# 
# $user2
# [1] " hashtag5"  " hashtag7"  " hashtag6 " " hashtag8" 
于 2012-05-23T13:36:43.903 に答える
1

1つの方法は、aggregate()関数を使用することです。差出人?aggregate

データをサブセットに分割し、それぞれの要約統計量を計算して、便利な形式で結果を返します

まず、データを読み込みます(再現可能な例を提供するために、将来的に質問でこれを行う必要があります。「優れたRの再現可能な例を作成する方法」を参照してください)。

txt <- "user1, hashtag1, hashtag2 
user1, hashtag3, hashtag4 
user2, hashtag5, hashtag6 
user2, hashtag7, hashtag8"

x <- read.delim(file = textConnection(txt), header = F, sep = ",", 
        strip.white = T, stringsAsFactors = F)

次に、を使用aggregate()してデータをサブセットに分割し、各サブセットを1次元配列に変換します。

aggregate(x[-1], by = x[1], function(z)
        {
            dim(z) <- c(length(z)) # Change dimensions of z to 1-dimensional array
            z
        })
#      V1     V2.1     V2.2     V3.1     V3.2
# 1 user1 hashtag1 hashtag3 hashtag2 hashtag4
# 2 user2 hashtag5 hashtag7 hashtag6 hashtag8

編集

このアプローチは、すべてのユーザーが同じ数のハッシュタグを持っている場合にのみ機能しますが、これはありそうもないことです。@JoshO'Brienの答えはより良いアプローチです。

于 2012-05-23T13:22:01.157 に答える
1

あなたは整形を探しています。reshapeコマンド (構文が面倒ですが、基本的には、id 変数として "user" を使用して "long" から "wide" に移動する必要があります) またはreshape2パッケージのいずれかを使用すると、必要なことが実行meltされdcastます。

または、ハッシュタグの数が異なる可能性があるため、次を使用してそれを行うことができますplyr

> colnames(x) <- c("user","tag1","tag2")
> 
> library(plyr)
> extract.hashtags <- function(x) {
+   x <- subset(x,select=c(-user))
+   mat <- as.matrix(x)
+   dim(mat) <- c(1,length(mat))
+   as.data.frame(mat)
+ }
> ddply(x, .(user), extract.hashtags )
   user       V1       V2       V3       V4
1 user1 hashtag1 hashtag3 hashtag2 hashtag4
2 user2 hashtag5 hashtag7 hashtag6 hashtag8
于 2012-05-23T13:15:37.443 に答える