2

我在设置sapply. 我确实有一个 for 循环可以完成我需要的工作,但是完成它需要很长时间。

变量名解释:

dat #raw data
df #empty data frame to preallocate memory
uniq.user #unique user id
uniq.item #unique item id

df 的列名:用户 ID、项目 ID 1、项目 ID 2、...、项目 ID n

我正在尝试创建一个二进制表,指示用户拥有哪个项目。
例子:

USERID1111 1 0 0 0 1
USERID2222 0 1 0 1 1

原始数据如下所示:

USERID1111 ITEM ID 1
USERID1111 ITEM ID 5
USERID2222 ITEM ID 2
USERID2222 ITEM ID 4
USERID2222 ITEM ID 5

我拥有的 for 循环是:

for(i in 1:length(uniq.user)){
    df[i, which(uniq.item %in% dat[df[i,1]== dat[,1], 2]) + 1] <- 1 
}

我将如何使用它来转换它sapply?(或任何其他应用功能)

谢谢!

ps 如果有更好的方法来执行这个任务,请告诉我!我正在尝试学习更有效的方法在 R 中做事。

4

1 回答 1

3

也许table可以是另一种选择:

# some data
df <- data.frame(id = c(1, 1, 2, 2, 2), item = c(1, 5, 2, 4, 5))

# define possible levels of 'item', so that also levels with zero count appear in table
df$item <- factor(df$item, levels = 1:5)

# make table
with(df, table(id, item))
#     item
# id  1 2 3 4 5
#   1 1 0 0 0 1
#   2 0 1 0 1 1
于 2013-10-11T23:00:32.137 回答