Подсчет значений в одном столбце - PullRequest
2 голосов
/ 18 января 2012

Я использую пакет sqldf в R и пытаюсь найти количество значений 1 и 2 в одном столбце. Мои данные выглядят так:

> head(d)
       bid status
1  201-300      1
2  201-300      1
3 901-1000      2
4  601-700      1
5  801-900      1
6  801-900      2

Я пытаюсь найти счетчик статуса, когда он равен 1, и счетчик статуса, когда он равен 2, а затем поместить их в два отдельных столбца.

Итак, используя пакет sqldf в R, я запустил следующий код:

sqldf("SELECT bid, SUM(IF(status='2', 1,0)) AS 'won', SUM(IF(status='1', 1,0)) AS 'lost', COUNT(bid) FROM d GROUP BY bid")

Однако я получаю следующее сообщение об ошибке.

Error in sqliteExecStatement(con, statement, bind.data) : 
  RS-DBI driver: (error in statement: no such function: IF)

Разве это невозможно с пакетом sqldf? Есть ли способ получить желаемый результат с помощью другой команды sql в R? (или с помощью plyr, rehape или любого другого инструмента в R)

Ответы [ 6 ]

4 голосов
/ 18 января 2012

IF - это специфический синтаксис MySQL, в то время как ошибка указывает на то, что вы разговариваете с базой данных SQLite.

Вам следует заменить IF на CASE, который будет работать на всех DMBS, совместимых с ANSI SQL-92.

SELECT  bid
        , SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS won
        , SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS lost
FROM    d
GROUP BY
        bid
2 голосов
/ 18 января 2012

Изменить: вопрос был помечен MySQL, но я не уверен, что это так

Взгляните на Функции потока управления MySQL . Вы можете использовать оператор IF (специфичный для MySQL) или CASE WHEN (совместимый с ANSI):

SELECT
bid,
SUM(IF(status = 2, 1, 0)) AS `won`,
SUM(IF(status = 1, 1, 0)) AS `lost`,
COUNT(bid)
FROM d
GROUP BY bid


SELECT
bid,
SUM(CASE status WHEN 2 THEN 1 ELSE 0 END) AS `won`,
SUM(CASE status WHEN 1 THEN 1 ELSE 0 END) AS `lost`,
COUNT(bid)
FROM d
GROUP BY bid
2 голосов
/ 18 января 2012

Обычный SQL для этого будет использовать CASE и SUM - я не делаю MySQL, но я предполагаю, что это должен быть правильный синтаксис:

SELECT SUM(CASE WHEN Status = '2' THEN 1 ELSE 0 END) as 'won',
       SUM(CASE WHEN Status = '1' THEN 1 ELSE 0 END) as 'lost',
...
1 голос
/ 25 января 2012

if недопустимо Синтаксис SQLite . Попробуйте это:

> sqldf("select bid, sum(status=1) lost, sum(status=2) won, count(*) count 
+ from d group by bid")
       bid lost won count
1  201-300    2   0     2
2  601-700    1   0     1
3  801-900    1   1     2
4 901-1000    0   1     1
1 голос
/ 18 января 2012

Поскольку вы сказали, что вас может заинтересовать решение на основе plyr, я могу дать следующее:

ddply(d, .(bid), summarise, won = sum(status==2), 
                            lost = sum(status==1), count = length(bid))
0 голосов
/ 18 января 2012

попробуйте это:

select count(bid) as 'bid_status_1' from d where bid_status = 1 union select count(bid) as 'bid_status_2'from d where bid_status = 2 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...