r - 在我的分组计数中使用 R 中的 data.table 重复行

标签 r group-by data.table

我真的很抱歉问这个愚蠢的问题,但我不明白出了什么问题。 我有一个数据集,我将其转换为 data.table 对象:

#generate 100,000 ids associated to a group in a data-set called base
id=c(1:100000)
group=sample(c(1:5),100000,TRUE)
base=cbind(id,group)
base=as.data.table(base)

我通过计算做了一个基本分组,得到分组的行数,结果表仍然包含相同的行数

counting=base[,COUNT:= .N, by = group]
nrow(counting)
#100000

我错过了什么? data.table 中是否有一个选项可以解决我的问题?

最佳答案

接受 akrun 的评论,我决定提供一个答案。您似乎不确定如何汇总数据并感到困惑。首先,关于构建数据集的一点:

set.seed(123)
id    = c(1:100000)
group = sample(c(1:5),100000,TRUE)
base  = data.frame(id,group)
setDT(base)

base

        id group
 1:      1     2
 2:      2     4
 3:      3     3
 4:      4     5
 5:      5     5
 ....

当您在多个向量上使用 cbind() 时,它们会被强制转换为同一个类以生成矩阵。更安全的方法是使用 data.frame(),它允许混合列类。而且,如果你有一个data.frame,你可以通过setDT的引用把它变成一个data.table,而不需要分配结果。

添加一个新列。您的代码基本上是在 data.table 对象中添加一个新列。当您使用 := 时,您正在执行与 dplyrtransform() 中的 mutate() 等效的操作基数 R,有一个重要区别。使用:=,该列通过引用添加到data.table中,因此无需分配结果。

base[, COUNT := .N, by = group]

base

   id group COUNT
1:  1     2 20099
2:  2     4 19934
3:  3     3 20001
4:  4     5 19933
5:  5     5 19933
...

在这里,您计算每个组存在多少数据点,并将值分配给所有行。例如,组 2 的总数为 20099。您将此数字分配给具有 group == 2 的所有行。您正在创建一个新列,而不是汇总数据。因此,您仍然有 100000 行。 base 中的行数与以往一样。目前没有通过引用修改行数的功能。

汇总数据。如果您想计算每组存在多少数据点并汇总数据,您需要以下内容。

dt2 <- base[, .(COUNT = .N), by = group]

dt2

   group COUNT
1:     2 20099
2:     4 19934
3:     3 20001
4:     5 19933
5:     1 20033

dim(dt2)

[1] 5 2

在这里,您要确保使用 =,而不是 :=,因为您正在汇总数据。有必要分配结果,因为我们正在创建一个新的 data.table。我希望这能让你头脑清醒。

关于r - 在我的分组计数中使用 R 中的 data.table 重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33116713/

相关文章:

r - 使用 data.table 写入和加载 JSON 字符串

r - ggplot2:向 geom_line 添加点

r - 如何在 R 中使用 glmnet 解决分类问题

.net - 有没有办法在 F# 中使用 Matlab 图像处理工具箱?

mysql - 在 Django 中使用带有 GROUP BY 子句的 COUNT(DISTINCT 字段)

mysql - SQL如何限制组数,每组行数没有限制

sql - COUNT 的 GROUPBY 的 DAX 表达式

R data.table - 将函数 A 应用于某些列,将函数 B 应用于其他某些列

r - 将列表字符串向量解析为多列 data.table

r - R中的3d散点图仍然为空