我有一个推文的平面文件,并希望按用户聚合他们的属性。
e.g。
user1, hashtag1, hashtag2
user1, hashtag3, hashtag4
user2, hashtag5, hashtag6
user2, hashtag7, hashtag8
我想转变成:
user1, hashtag1, hashtag2, hashtag3, hashtag4
user2, hashtag5, hashtag6, hashtag7, hashtag8
有优雅的方法吗?
答案 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变量)或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
答案 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的回答是更好的方法。