如何避免使用 for 循环

时间:2021-05-05 17:29:53

标签: r loops vectorization

我目前正在 R 中处理音乐平台的收听数据。

我有整个数据集的一个子集(listening.subset)。它包含 6 列(用户、艺术家、周、计数、用户类型、二进制)。 每个用户可以是焦点用户、朋友或邻居。有单独的数据集将焦点用户与他们的朋友 (friend.data) 和邻居 (neighbor.data) 联系起来,但我添加了一个列来指示用户的类型。

现在,我有以下 for 循环来指示朋友在焦点用户收听同一艺术家之前的 10 周内是否听过该艺术家的歌曲。如果是这种情况,二进制列必须显示 0,否则显示 1。

listening.subset$binary <- NA
for (i in 1:count(listening.subset)$n) {
  test_user <- listening.subset[i,]
  test_week <- test_user$Week
  test_artist <- test_user$artist
  
    if (test_user$user_type == "friend") {
foc <- vlookup(test_user$USER, friend.data, result_column = 1, lookup_column = 2)

prior_listen <- listening.subset %>% filter(USER == foc) %>% group_by(artist) %>% filter(test_week >= (Week -10) & test_week <= Week) %>% filter(artist == test_artist)
        if (nrow(prior_listen) > 0) {
  listening.subset[i,]$binary <- 0
        }
else(
listening.subset[i,]$binary <- 1)
  }
}

这个 for 循环的问题是应用到完整数据集花费的时间太长。因此,我想应用矢量化。然而,这个概念对我来说很模糊,在网上阅读后,我仍然不知道应该如何调整我的代码。

我希望有人知道如何使用矢量化并且可以帮助我。

EDIT1:总数据集包含大约 5000 万个条目。但是,我可以将其拆分为 10 个数据集,每个数据集 500 万个。

EDIT2:listening.subset:

"clubanddeform", "HyprMusic", "Peter-182", "komosionmel", "SHHitsKaty", 
"Sonik_Villa", "Haalf"), artist = c("Justin Timberlake", "Ediya", 
"Lady Gaga", "El Guincho", "Lighthouse Family", "Pidżama Porno", 
"The Men", "Modest Mouse", "Com Truise", "April Smith and The Great Picture Show"
), Week = c(197L, 213L, 411L, 427L, 443L, 232L, 431L, 312L, 487L, 
416L), COUNT = c(1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 6L, 11L), user_type = c("friend", 
"friend", "friend", "friend", "neighbour", "friend", "neighbour", 
"friend", "focal", "friend"), binary = c(1, 1, 1, 1, NA, 1, NA, 
1, NA, 1)), row.names = c(NA, 10L), class = "data.frame")

Where Week 是指用户在哪一周收听特定乐队(范围在 1 到 527 之间)的指标,而 COUNT 等于用户在该特定周内收听该艺术家的次数。

回顾:二元变量应指示“朋友用户”是否在焦点用户播放乐队之前的 10 周内听过与“焦点用户”相同的乐队。社交关系可以在friend.data 中找到,如下图所示。

structure(list(USER = c("TheMariner", "TheMariner", "TheMariner", 
"TheMariner", "TheMariner", "TheMariner", "TheMariner", "TheMariner", 
"TheMariner", "TheMariner"), FRIEND = c("npetrovay", "marno25", 
"lennonstarr116", "sachmonkey", "andrewripp", "daledrops", "Skittlebite", 
"Ego_Trippin", "pistolgal5", "jjollett")), row.names = c(NA, 
10L), class = "data.frame")

对于每 190 个焦点用户(第一列),好友列在其旁边,在第二列中。

0 个答案:

没有答案
相关问题