我在R数据框中有很多数据如下所示:
> data[1:10,]
user movie score
1 0 0 5
2 0 1 4
3 0 2 5
4 0 3 4
5 0 4 4
6 0 5 5
7 0 6 4
8 0 7 5
9 0 8 5
10 0 9 3
现在我想把它变成一个像这样的大矩阵:
user m1 m134
1023 5 0 0 0 3 0 0 0 1 0 1 ... 5
2831 0 0 0 0 2 5 0 1 ......... 0
...
第一列是用户ID,其余字段是电影ID,如果用户评分,则应显示为分数,否则为0.
有没有简单有效的方法来制作它?感谢。
答案 0 :(得分:1)
您并不明确您想要的数据结构,但这会给您一个命名列表,其中名称是用户,列表的元素是项目的向量。
# Generate sample data
df<-read.table(textConnection('
user1, item1
user1, item2
user1, item3
user1, item4
user2, item2
user2, item3
user2, item6'))
names(df)<-c('user','item')
# Split
by(df$item,df$user,function(x)x)
# df$user: user1,
# [1] item1 item2 item3 item4
# Levels: item1 item2 item3 item4 item6
# ------------------------------------------------------------
# df$user: user2,
# [1] item2 item3 item6
# Levels: item1 item2 item3 item4 item6
您的新问题可以通过acast
完成。
library(reshape2)
acast(data,user~movie)
答案 1 :(得分:1)
# example data
set.seed(1); df <- data.frame(user=sample(1:5, size=10, replace=T),
item=sample(1:10, size=10, replace=T))
# convert and print
items <- sapply(unstack(df, form=item ~ user), paste, collapse=",")
as.data.frame(items)
# items
# 1 8
# 2 3,2,8
# 3 7
# 4 10,4
# 5 4,5,8
或
paste(names(items), items, sep=", ")
# [1] "1, 8"
# [2] "2, 3,2,8"
# [3] "3, 7"
# [4] "4, 10,4"
# [5] "5, 4,5,8"
答案 2 :(得分:0)
看起来你想要一个列表结构;每个组件中的不同长度向量。实现此目的的一种简单方法是在split()
上使用item
,并使用变量user
形成组。
split(df$item, df$user)
给出了
> split(df$item, df$user)
$`user1,`
[1] item1 item2 item3 item4
Levels: item1 item2 item3 item4 item6
$`user2,`
[1] item2 item3 item6
Levels: item1 item2 item3 item4 item6