结合R中的多个观察结果

时间:2012-05-23 12:25:43

标签: database r twitter

我有一个推文的平面文件,并希望按用户聚合他们的属性。

e.g。

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

我想转变成:

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

有优雅的方法吗?

3 个答案:

答案 0 :(得分:3)

除非每个用户的主题标签数量始终相同,否则我会将结果汇总到一个列表中。列表的每个元素都是一个用户的主题标签的(可能是可变长度的)向量。

# 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" 

答案 1 :(得分:1)

你正在寻找一个重塑。 reshape命令(具有痛苦的语法,但基本上您希望从“long”变为“wide”,其中“user”作为您的id变量)或reshape2melt然后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

答案 2 :(得分:1)

一种方法是使用aggregate()功能。来自?aggregate

  

将数据拆分为子集,计算每个子集的摘要统计信息,   并以方便的形式返回结果

首先,请阅读您的数据(您将来的问题应该这样做,以提供可重现的示例,请参阅:How to make a great R reproducible example?):

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

修改

此方法仅在所有用户具有相同数量的主题标签时才有效,这似乎不太可能。 @Josh O'Brien的回答是更好的方法。