修改 下面非常有用,所以我已经玩了几个小时。最终我最终尝试了一些不起作用的东西:从每个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中做某事(即计数点)。
非常感谢所有帮助!提前谢谢!
答案 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))