случай

df=data.frame(id=c(101,102,102,103,104,104,104),
         calmonth=c('01','01','01','01','01','01','02'),
         product=c('apple','apple','htc','htc','apple','htc','nokia'),
         bb=sample(1:20,7))

> df
   id calmonth product bb
1 101       01   apple  4
2 102       01   apple  9
3 102       01     htc  8
4 103       01     htc  5
5 104       01   apple 16
6 104       01     htc 19
7 104       02   nokia 20

Оператор sql: получить пересечение, в котором идентификатор использует и продукт "яблоко", и продукт "htc", когда calmonth = "01"

select id from df where calmonth='01' and product="apple"  and id in 
(select id from df where product="htc" and calmonth="01")

прогнозируемый результат

   id calmonth     product
1 102       01 apple & htc
2 104       01 apple & htc

Так что же отвечает за R-запрос?

sql r
3
jasmine_007 7 Янв 2014 в 11:47

2 ответа

Лучший ответ

Если вы предпочитаете синтаксис SQL, используйте пакет sqldf:

library(sqldf)
sqldf("
      select * 
      from (
            select id,
                   calmonth,
                   group_concat(product, ' & ') product
            from df
            group by id, calmonth
           ) 
      where product='apple & htc' and
            calmonth='01'
      ")
3
zx8754 7 Янв 2014 в 09:30

Ваш оператор SQL не дает того результата, который вы показываете. Он возвращает (выбирает) только идентификаторы, а не ту таблицу и объединенный столбец? Нет?

SELECT id 
FROM   df 
WHERE  calmonth = '01' 
       AND product = "apple" 
       AND id IN (SELECT id 
                  FROM   df 
                  WHERE  product = "htc" 
                         AND calmonth = "01") 

В R это примерно:

with(df, 
intersect(
id[calmonth=='01' & product=='apple'], 
id[product=="htc" & calmonth=="01"]))

[1] 102 104
2
Hawk 7 Янв 2014 в 11:07