sqldf中的group by语句问题

时间:2015-10-26 06:35:45

标签: r sqldf

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

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

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

3 个答案:

答案 0 :(得分:0)

# 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, ]

我使用合并汇总而不是 sqldf

使用 sqldf

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

答案 1 :(得分:0)

此查询为您提供了&#34; text&#34;观察计数小于5的情况。您需要编写另一个查询,从主数据集中选择所有属性&#34; text&#34;出现在测试中。希望这会有所帮助。

答案 2 :(得分:0)

问题中的查询根据标准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

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