【问题标题】:Issue with group by statement in sqldfsqldf中的group by语句问题
【发布时间】:2015-10-26 06:35:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: r sqldf


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢!可能是 sas sql 的行为方式不同,我应该先学习标准的 sql 规则。我明白你的意思,我会从下一次开始提供自包含代码。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
      # 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)")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 2021-11-13
        • 2013-11-19
        • 1970-01-01
        • 1970-01-01
        • 2018-09-07
        • 2010-10-19
        相关资源
        最近更新 更多