我有一个包含两列(字符)的数据集 - 文本,源,我想创建一个数据集,以便文本列中的特定值小于5次。我使用下面的代码,但它只给出第一次出现,而我需要满足该条件的所有观察。例如:'iphone'在文本中存在4次,所以我需要所有4个观察及其相应的来源,但我只得到一个观察。
test = sqldf('select * , count(*) as count from base group by text having count < 5')
我熟悉SAS中的proc sql
,我最近开始学习R. sqldf
是否以不同的方式运作?
答案 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
(将来请提供完整的自包含代码,包括读者可以运行以重现问题的所有输入。)