R 以矢量化的方式从数据帧填充矩阵值

R 以矢量化的方式从数据帧填充矩阵值,r,matrix,dataframe,vectorization,R,Matrix,Dataframe,Vectorization,我在中有一个数据框,有3列,其中两列表示矩阵中的I,j索引。对于数据帧的每一行,我想将矩阵中对应的I,j值填充为1 共享下面的数据和矩阵,我认为这将使描述问题变得更容易: data = structure(list(sale_id = c(0L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L,

我在中有一个数据框,有3列,其中两列表示矩阵中的I,j索引。对于数据帧的每一行,我想将矩阵中对应的I,j值填充为1

共享下面的数据和矩阵,我认为这将使描述问题变得更容易:

data = structure(list(sale_id = c(0L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 10L, 10L, 11L, 11L, 11L, 
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 14L, 15L, 16L, 16L, 
17L, 17L, 17L, 17L, 17L, 18L, 18L, 19L, 19L, 20L, 20L, 21L, 22L, 
22L, 23L, 23L, 23L, 24L, 24L, 25L, 25L, 26L, 26L, 27L, 27L, 28L, 
28L, 29L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 31L, 31L, 32L, 32L, 
33L, 33L, 33L, 33L, 33L, 33L, 34L, 34L), user_id = c(3219L, 144L, 
2884L, 2884L, 2155L, 2155L, 2155L, 2155L, 2817L, 2817L, 2817L, 
2817L, 2817L, 2817L, 144L, 144L, 2850L, 2850L, 2850L, 2850L, 
2850L, 2850L, 2850L, 2850L, 2850L, 144L, 144L, 144L, 144L, 144L, 
144L, 144L, 144L, 2817L, 2817L, 2075L, 2075L, 2546L, 2546L, 2546L, 
2687L, 2687L, 2687L, 2687L, 2687L, 2687L, 2687L, 2687L, 170L, 
2546L, 1963L, 144L, 144L, 1825L, 1825L, 1825L, 1825L, 1825L, 
144L, 144L, 2155L, 2155L, 2546L, 2546L, 144L, 2155L, 2155L, 144L, 
144L, 144L, 3182L, 3182L, 3343L, 3343L, 170L, 170L, 2155L, 2155L, 
2793L, 2793L, 1564L, 2250L, 2250L, 2250L, 2250L, 2250L, 2250L, 
2250L, 3083L, 3083L, 2075L, 2075L, 144L, 144L, 144L, 144L, 144L, 
144L, 829L, 829L), item_id = c(174L, 10L, 179L, 162L, 171L, 182L, 
179L, 185L, 199L, 179L, 195L, 174L, 162L, 198L, 144L, 69L, 57L, 
47L, 83L, 80L, 10L, 117L, 14L, 90L, 88L, 186L, 167L, 192L, 142L, 
162L, 173L, 151L, 134L, 191L, 166L, 118L, 128L, 98L, 95L, 119L, 
130L, 154L, 155L, 181L, 120L, 118L, 77L, 120L, 101L, 31L, 139L, 
10L, 30L, 182L, 179L, 139L, 173L, 171L, 80L, 39L, 26L, 69L, 163L, 
151L, 175L, 150L, 148L, 121L, 147L, 88L, 183L, 177L, 132L, 167L, 
176L, 172L, 57L, 78L, 98L, 99L, 118L, 102L, 141L, 97L, 99L, 79L, 
32L, 17L, 16L, 30L, 66L, 54L, 57L, 91L, 81L, 39L, 92L, 123L, 
87L, 62L)), .Names = c("sale_id", "user_id", "item_id"), row.names = c(NA, 
100L), class = "data.frame")

M = matrix(0, nrow = max(data$user_id), ncol = max(data$item_id))

head(data, n = 6)
    sale_id user_id item_id
1         0    3219     174
2         1     144      10
3         2    2884     179
4         2    2884     162
5         3    2155     171
6         3    2155     182
i列是user_id,j列是item_id。因此,对于第一行,我希望M[3219174]=1,然后我希望M[144,10]=1,等等。我希望在没有for循环的情况下执行此操作,考虑到矩阵的大小,这太慢了

作为参考,我目前正在做的是:

for(i in 1:nrow(data)) {
  M[data$user_id[i], data$item_id[i]] = 1
}
然而,我的问题规模相当大,这对我的问题来说太慢了。非常感谢您的帮助!谢谢

编辑:我尝试了以下几点:

apply(data, 1, FUN = function(x) M[x[2],x[3]] = 1)
但它并没有像我希望的那样工作(甚至比for循环需要更长的时间)。

试试这个:

M[cbind(data$user_id,data$item_id)] <- 1

M[cbind(数据$user\u id,数据$item\u id)]是否确实需要矩阵来包含不存在的id的索引?你最终得到了一个非常大、非常稀疏的矩阵,这可能没有多大用处,取决于你接下来要用它做什么。哇,太快了——这太棒了,因为我可以用这种格式解决很多问题。谢谢989!