我尝试使用sqldf和data.table实现sql查询。
我需要分别使用这两个不同的库来完成。
不幸的是,我不能使用data.table产生相同的结果。
library(sqldf)
library(data.table)
Id <- c(1,2,3,4)
HasPet <- c(0,0,1,1)
Age <- c(20,1,14,10)
Posts <- data.table(Id, HasPet, Age)
# sqldf way
ref <- sqldf("
SELECT Id, HasPet, MAX(Age) AS MaxAge
FROM Posts
GROUP BY HasPet
")
# data.table way
res <- Posts[,
list(Id, HasPet, MaxAge=max(Age)),
by=list(HasPet)]
head(ref)
head(res)
sqldf的输出为:
> head(ref)
Id HasPet MaxAge
1 1 0 20
2 3 1 14
虽然data.table的输出不同:
> head(res)
HasPet Id HasPet MaxAge
1: 0 1 0 20
2: 0 2 0 20
3: 1 3 1 14
4: 1 4 1 14
请注意,sql查询不能修改。
2条答案
按热度按时间mefy6pfw1#
这就产生了大量的data.table。如果要按组计算最大值或最小值,最好的方法是自联接。很快,只是有点神秘。
您可以一步一步地建立它:在data.table中,您可以在i中选择,在j中执行,然后分组。因此,第一步是在团队的每个层次中找到我们想要的东西
我们可以用
.I
要检索每行的整数向量,那么之前的v1逻辑向量true和false在每个组中都有索引,所以我们只有包含每个组的max的行。然后我们使用刚才生成的v1列来调用data.table中的特定行(1和3)。就这样!
mu0hgdu02#
你可以用
.SD
为的每个值获取行的子集HasPet
.