数据来自我正在玩的另一个问题:
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
Run Code Online (Sandbox Code Playgroud)
这是令人惊讶的行为:
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?!
Run Code Online (Sandbox Code Playgroud)
谢谢mnel和Victor K.自然的后续行动是 - 不应该是2,这是一个错误吗?我期望
dt[, blah, by = user]
Run Code Online (Sandbox Code Playgroud)
返回相同的结果
rbind(dt[user == 3, blah], dt[user == 4, blah])
Run Code Online (Sandbox Code Playgroud)
这种期望是不正确的?
惯用的data.table方法是使用.N
dt[ , .N, by = list(user, country)]
Run Code Online (Sandbox Code Playgroud)
这将更快,它也将保留国家与原始国家相同的级别.
如mnel注释中所述,as.data.frame(table(...))生成一个数据框,其中第一个变量是一个因子.因为user == 4,因子中只有一个级别,内部存储为1.
你想要的是因子水平,但你得到的是如何在内部存储因子(作为整数,从1开始).以下提供了预期的结果:
> dt[, lapply(as.data.frame(table(country)), as.character), by = user]
user country Freq
1: 3 1 4
2: 3 2 1
3: 4 2 5
Run Code Online (Sandbox Code Playgroud)
更新.关于你的第二个问题:不,我认为data.table行为是正确的.当你加入两个不同级别的因子时,在普通R中会发生同样的事情:
> a <- factor(3:5)
> b <- factor(6:8)
> a
[1] 3 4 5
Levels: 3 4 5
> b
[1] 6 7 8
Levels: 6 7 8
> c(a,b)
[1] 1 2 3 1 2 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |