【问题标题】:Count points based on unique values in column根据列中的唯一值计算点数
【发布时间】:2016-03-10 09:23:15
【问题描述】:

编辑: 下面是非常有用的,所以我已经玩了几个小时了。最终,我尝试了一些不起作用的方法:从每个 id 的点数的平均值来看,我尝试只包括每个 id 的最后(例如)5 次点击/浏览量。我使用的代码是:

megest

但是,它只会生成一个如下所示的表格:

id    points
1     c(20,0)
2     c(20,10,20,100,20)

而不是将它们相加并产生平均值。我很好奇,有没有办法解决这个问题?提前致谢! (并为这个问题中的许多新问题道歉,但 R 让我非常兴奋)。


各位经验丰富的 R 用户,

我是 R 新手,所以如果答案是直截了当的或者我不清楚,我深表歉意。

我创建了一个数据框,其中包含 16 个变量的大约 500,000 次点击流数据观察。其中两列是“id”和“assigned points”

其中“id”表示互联网会话 id,“points”表示我为每次点击/浏览量分配的点数(可能是某些点击没有分配点数),例如:

id   points
1    10
1    N/A
1    30
2    100
3    20
3    10

在“id”列中,大约有 60000 个唯一值。我想要实现的是,计算分配给每个“id”的点数,并让 R 自动为所有唯一 id 执行此操作。所以我正在寻找这样的结果:

1 [40], 2 [100], 3[30]

但是,我完全不知道如何告诉 R 识别所有唯一 ID 并在所有这些唯一 ID 中做某事(即计数点)。

所有帮助将不胜感激!提前致谢!

【问题讨论】:

  • 申请sum,另见rowsum(data$points, data$id, na.rm = TRUE)

标签: r


【解决方案1】:

我们可以使用 group by 操作来做到这一点。我们将“data.frame”转换为“data.table”(setDT(df1)),按“id”分组,我们得到“points”的sum

library(data.table)
setDT(df1)[, list(points=sum(points, na.rm=TRUE)), by = id]

这也可以使用来自base Raggregate 或使用dplyr 方法来完成。鉴于数据集很大,data.table 方法会很快(dplyr 也很快)。

注意:假设是 1)“点”列是 numeric 类。 2) N/A 是真正的NA

【讨论】:

  • 太棒了,非常感谢!我从未见过 setDT 函数,但一定会查找并了解更多信息!谢谢!
  • 它就像一个魅力 :) 勾选框!如果我获得更多 R 知识,我一定会为 stackoverflow 做出贡献。
  • 和下面一样,我现在很好奇 :) 如果你想再次将点除以特定 id 的 #,你会怎么做(所以在 id1 的情况下,你会有 40/3)?您是否会创建一个新列来计算“id”中唯一值的数量,然后以某种方式将计数除以新列中的相应行?
  • @sfvisser 我认为你需要meansetDT(df1)[, list(points=mean(points, na.rm=TRUE)), by = id]
  • 感谢akrun的回答!
【解决方案2】:

aggregate 选项:

df$points <- as.numeric(as.character(df$points))
Warning message:
NAs introduced by coercion 
> aggregate(points ~ id, df, sum)
#  id points
#1  1     40
#2  2    100
#3  3     30

根据 OP 的评论,我们可以通过将 NA 更改为 0 来获得 mean,并继续使用相同的 aggregate 想法:

df[is.na(df)] <- 0
aggregate(points ~ id, df, mean)
#  id    points
#1  1  13.33333
#2  2 100.00000
#3  3  15.00000

数据

df <- structure(list(id = c(1L, 1L, 1L, 2L, 3L, 3L), points = structure(c(1L, 
5L, 4L, 2L, 3L, 1L), .Label = c("10", "100", "20", "30", "N/A"
), class = "factor")), .Names = c("id", "points"), class = "data.frame", row.names = c(NA, 
-6L))

【讨论】:

  • 也有效,非常感谢!仅仅因为这引发了我的好奇心:如果你想再次将分数除以特定 id 的 #,你会怎么做(所以在 id1 的情况下,你会有 40/3)?
  • 好极了,工作非常顺利。您可以在 R 中做很多事情。感谢您的支持!
猜你喜欢
  • 2015-06-13
  • 2020-10-09
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多