在 dplyr 和 data.table 包中使用长度函数聚合

时间:2021-05-08 18:20:03

标签: r dplyr data.table aggregate

我有 data.frame,我想将我的列分组到 dplyr 和 data.table 包中。

这是我的 data.frame:

auto &val4 = *m.try_emplace(0, "try_emplace").first;

我想使用 length 函数进行分组并得到如下结果:

df <- data.frame(OwnerUserId = sample(c(-1, 2:10), size = 10),
                  TypeOfId = sample(c(1,2), size = 10, replace = T))

df

## OwnerUserId TypeOfId
## 1           10        1
## 2            6        2
## 3            7        2
## 4            3        2
## 5            2        2
## 6            9        2
## 7           -1        2
## 8            5        1
## 9            8        2
## 10           4        1

我做到了

new <- aggregate(x = df[, "OwnerUserId"],
                 by = df["OwnerUserId"], 
                 FUN = length)

##    OwnerUserId x
## 1           -1 1
## 2            2 1
## 3            3 1
## 4            4 1
## 5            5 1
## 6            6 1
## 7            7 1
## 8            8 1
## 9            9 1
## 10          10 1

我得到了

new <- df %>% group_by(OwnerUserId) %>% summarise(AnswersNumber = length(df[, "OwnerUserId"]))

结果不一样。

我也尝试在 data.table 中执行此操作,但出现错误。

也许还有一些其他函数类似于 aggregate() 中的 length 函数?

1 个答案:

答案 0 :(得分:4)

我们可以在n()中使用dplyr

library(dplyr)
new <- df %>%
    group_by(OwnerUserId) %>% 
    summarise(AnswersNumber = n())

.N中的data.table

library(data.table)
setDT(df)[, .(AnswersNumber = .N), OwnerUserId]

df[, "OwnerUserId"] 返回整个列,打破了用 'OwnerUserId' 创建的分组,因此我们得到整个列的 length 而不是组的长度。我们也可以改用 summarise(AnswerNumber = length(OwnerUserId))。但是,n() 专门用于此

相关问题