我在设置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
转换此内容? (或任何其他应用功能)
谢谢!
P.S。如果有更好的方法来执行此任务,请告诉我!我正试图在R中学习更有效的方法。
答案 0 :(得分: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