sqldf 中的 group by 语句问题

Issue with group by statement in sqldf

我有一个包含两列(字符)的数据集 - 文本、源,我想创建一个数据集,如果文本列中的特定值出现少于 5 次。我正在使用下面的代码,但它只给出第一次出现,而不是我需要满足该条件的所有观察结果。例如:'iphone' 在 text 中出现了 4 次,所以我需要所有 4 个观察结果及其相应的来源,但我只得到一个观察结果。

test = sqldf('select * , count(*) as count from base group by text having count < 5')

我熟悉 SAS 中的 proc sql,我最近开始学习 R。sqldf 的工作方式是否不同?

# Let me assume a data frame
base <- data.frame(source = 1:100, text = sample(letters,replace=T,100))    
base2 <- merge(base, aggregate(base$text, by=list(base$text), length), by.x="text", by.y="Group.1")
your_output <- base2[base2$x<5, ]

我使用了 mergeaggregate 而不是 sqldf.

使用 sqldf:

sqldf("select * from base where text in (select text from base group by text having count(*) < 5)")

此查询为您提供 "text" 的观察计数小于 5。您需要编写另一个查询,从主数据集中选择所有 "text" 存在的属性在测试中。希望这有帮助。

问题中的查询根据标准 SQL 规则工作,并且在任何支持 SQL 的系统中都会以这种方式工作。

看来你真的想要这个:

library(sqldf)
base <- data.frame(text = rep(letters[1:3], 4:6), record = 1:15)  # test input

sqldf('select * 
       from (select text, count(*) as count 
             from base 
             group by text 
             having count < 5)
       join base using(text)')

测试输入给出:

  text count record
1    a     4      1
2    a     4      2
3    a     4      3
4    a     4      4

(将来请提供完整的自包含代码,包括读者可以 运行 重现问题的所有输入。)