如何将大量用户项对转移到用户项矩阵中?

时间:2014-01-18 14:22:30

标签: r reshape

对不起,我写过之前没有正确解释我的问题,这是编辑后的版本:

我在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.

有没有简单有效的方法来制作它?感谢。

3 个答案:

答案 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