r - data.table 和表意外行为

标签 r data.table

数据来 self 正在研究的另一个问题:

dt <- data.table(user=c(rep(3, 5), rep(4, 5)),
                 country=c(rep(1,4),rep(2,6)),
                 event=1:10, key="user")
#    user country event
#1:     3       1     1
#2:     3       1     2
#3:     3       1     3
#4:     3       1     4
#5:     3       2     5
#6:     4       2     6
#7:     4       2     7
#8:     4       2     8
#9:     4       2     9
#10:    4       2    10

这是令人惊讶的行为:

dt[user == 3, as.data.frame(table(country))]
#  country Freq
#1       1    4
#2       2    1

dt[user == 4, as.data.frame(table(country))]
#  country Freq
#1       2    5

dt[, as.data.frame(table(country)), by = user]
#   user country Freq
#1:    3       1    4
#2:    3       2    1
#3:    4       1    5
#             ^^^ - why is this 1 instead of 2?!

感谢 mnel 和 Victor K。自然的后续行动是 - 它不应该是 2,即这是一个错误吗?我以为

dt[, blah, by = user]

返回相同的结果给

rbind(dt[user == 3, blah], dt[user == 4, blah])

这个期望不正确吗?

最佳答案

惯用的 data.table 方法是使用 .N

 dt[ , .N, by = list(user, country)]

这会快得多,而且它还会将国家保留为与原始类别相同的类别。

关于r - data.table 和表意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20258020/

相关文章:

r - 使用 dplyr mutate 函数根据当前行有条件地创建新变量

同时向前和向后滚动 data.table

r - 逐步找到R中列表中最频繁的项目

r - 为什么 `pivot_wider` 在 `data.table` 上不起作用

从字符向量中删除可能包含特殊字符而不匹配单词部分的整个单词列表

r - 如何计算十分位数的优势比和 95% 置信区间

r - 根据现有列的子字符串在 R data.table 中创建列

r - 在不使用 apply 的情况下从 data.table 行创建向量

R:按年龄计算风险时间

r - 使用不适用的 "factors"进行聚合