我有 data.frame,我想将其分组到 dplyr 和 data.table 包中。
这是我的数据框:
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
我想使用 length 函数进行分组并得到如下结果:
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"]))
我得到了
## OwnerUserId AnswersNumber
## <dbl> <int>
## 1 -1 10
## 2 2 10
## 3 3 10
## 4 4 10
## 5 5 10
## 6 6 10
## 7 7 10
## 8 8 10
## 9 9 10
## 10 10 10
结果并不相同。
我也尝试在 data.table 中执行此操作,但出现错误。
也许还有一些其他函数类似于aggregate()中的length函数?
最佳答案
我们可以在dplyr
中使用n()
library(dplyr)
new <- df %>%
group_by(OwnerUserId) %>%
summarise(AnswersNumber = n())
data.table
中的和.N
library(data.table)
setDT(df)[, .(AnswersNumber = .N), OwnerUserId]
df[, "OwnerUserId"]
返回整个列,打破使用“OwnerUserId”创建的分组,因此我们得到整个列的长度
,而不是组的长度。我们也可以使用 summarise(AnswerNumber = length(OwnerUserId))
。但是,n()
专门用于此
关于r - 使用 dplyr 和 data.table 包中的 length 函数聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67450809/