长格式数据到宽格式(尝试使用for循环)我可以使用sapply吗?

时间:2013-10-11 22:47:15

标签: r sapply

我在设置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中学习更有效的方法。

1 个答案:

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