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, ]
我使用了 merge 和 aggregate 而不是 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
(将来请提供完整的自包含代码,包括读者可以 运行 重现问题的所有输入。)
我有一个包含两列(字符)的数据集 - 文本、源,我想创建一个数据集,如果文本列中的特定值出现少于 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, ]
我使用了 merge 和 aggregate 而不是 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
(将来请提供完整的自包含代码,包括读者可以 运行 重现问题的所有输入。)