【问题标题】:R: Count all previous rows where certain conditions are met for each rowR:计算每行满足某些条件的所有先前行
【发布时间】:2019-12-04 19:39:47
【问题描述】:

我目前正在撰写在线广告课程的硕士论文。我有一个包含不同用户的 cookie 数据的数据集,我的目标是构建其他变量,用于计算用户网站类别访问的总数。

这是一个说明性示例,说明了我的数据集的结构以及我的数据集的相关变量的外观:

> print(data)
   Imp_ID User_ID  Website.category
1      10      50 Apparel & Jewelry
2      11      51 Apparel & Jewelry
3      12      52        Automotive
4      13      50 Apparel & Jewelry
5      14      51        Automotive
6      15      52        Automotive
7      16      52        Automotive
8      17      51 Apparel & Jewelry
9      18      50 Apparel & Jewelry
10     19      50        Automotive
11     20      51        Automotive

Impression ID 是唯一的,我有 100 个不同的用户和 20 个不同的网站类别。所有印象都按日期和时间排序(日期时间变量也可用,但我认为这个问题不是必需的)

我要做的是计算每个相应展示事件的先前用户网站类别展示的总数。例如,我有网站类别“服装和珠宝”。当用户对“服装珠宝”类网站的第一印象时,计数变量count_app.jew应该等于1,第二次出现相同的用户-网站类别组合时,这个新变量的值应该为 2,以此类推。

因此,我认为我需要为每一行定义一个类似于 for 循环的东西,它为每一行计算满足预定义条件的所有先前观察值(可能以某种方式使用 if 语句)。

这是我想要的结果:


> print(data2)
   Imp_ID User_ID  Website.category Count_app.jew Count_automotive
1      10      50 Apparel & Jewelry             1                0
2      11      51 Apparel & Jewelry             1                0
3      12      52        Automotive             0                1
4      13      50 Apparel & Jewelry             2                0
5      14      51        Automotive             1                1
6      15      52        Automotive             0                2
7      16      52        Automotive             0                3
8      17      51 Apparel & Jewelry             2                1
9      18      50 Apparel & Jewelry             3                0
10     19      50        Automotive             3                1
11     20      51        Automotive             2                2

为了解释逻辑,count_app.jew 在第一行等于 1,因为 ID=50 的用户在“服装和珠宝”网站上的第一印象。在第 2 行中,ID=51 的用户在“Apparel&Jewelry”网站上的第一印象,因此 count_app.jew 再次等于 1。在第 3 行中,ID=52 的用户访问了“汽车”类别的网站.由于此用户之前从未访问过“服装和珠宝”类别的网站,因此 count_app.jew 等于 0。相反,count_automotive 等于 1。在第 4 行中,count_app.jew 为 2,因为 ID=50 的用户已经是第二次访问该类别的网站了...

因此,我的问题是如何创建这些额外的计数变量。

我希望,背后的逻辑很清楚,有人知道解决这个问题的适当方法。由于我没有大的编码背景,我非常感谢任何帮助!

【问题讨论】:

  • 嗨,Domi,Berbi,您能展示一个使用 dput 的数据示例吗?

标签: r for-loop count


【解决方案1】:

这应该可以解决问题

library(dplyr)    
df%>%group_by(User_ID)%>%mutate(Count_app.jew=cumsum(Website.category=="Apparel & Jewelry"),
                                    Count_automotive=cumsum(Website.category=="Automotive"))

数据

> dput(df)
structure(list(Imp_ID = 10:20, User_ID = c(50L, 51L, 52L, 50L, 
51L, 52L, 52L, 51L, 50L, 50L, 51L), Website.category = c("Apparel & Jewelry", 
"Apparel & Jewelry", "Automotive", "Apparel & Jewelry", "Automotive", 
"Automotive", "Automotive", "Apparel & Jewelry", "Apparel & Jewelry", 
"Automotive", "Automotive")), row.names = c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10", "11"), class = "data.frame")

【讨论】:

    【解决方案2】:
    list_df <- by(
      dat, dat$User_ID,
      function(x) within(x, {
          Count_app.jew <- cumsum(Website.category == "Apparel & Jewelry")
          Count_automotive <- cumsum(Website.category == "Automotive")
        })
    )
    
    dat <- do.call(rbind, list_df)
    dat[order(dat$Imp_ID), ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2013-05-09
      • 2021-08-08
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多