根据列中的唯一值计算点数

时间:2016-03-10 09:23:15

标签: r

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

  

megatest< -aggregate(points~session_id,pointsperid,mean,FUN = tail,n = 5)

但是,它只生成一个表格如下:

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

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

经验丰富的R用户,

我是R的新手,所以如果答案很简单或者我不清楚,我会道歉。

我在16个变量中创建了大约500,000个点击流数据观测数据框。其中两列是“id'和'分配点'

在哪里' id'表示互联网会话ID,'积分'我为每次点击/网页浏览分配的点数(可能是某些点击没有分配多个点),例如:

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中做某事(即计数点)。

非常感谢所有帮助!提前谢谢!

2 个答案:

答案 0 :(得分:4)

我们可以使用group by operations来做到这一点。我们将'data.frame'转换为'data.table'(setDT(df1)),按'id'分组,我们得到'{1}}'点'。

sum

也可以使用library(data.table) setDT(df1)[, list(points=sum(points, na.rm=TRUE)), by = id] 中的aggregate或使用base R方法完成此操作。鉴于数据集很大,dplyr方法会很快(data.table也很快)。

注意:假设是1)列'points'是dplyr类。 2)numeric是真实的N/A

答案 1 :(得分:1)

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的评论,我们可以通过将mean更改为NA来获取0,并继续使用相同的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))