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 に答える