2012-01-17 44 views
2

我在R中使用sqldf軟件包,並試圖找到單個列中值爲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,然後讓他們在兩個單獨的列。

因此,使用R中的sqldf包,我跑到下面的代碼:

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包? 有沒有辦法用R中的另一個sql命令獲得想要的結果? (或與plyr,reshape或R中的任何其他工具)

+1

使用'table(d $ status)' – Andrie 2012-01-17 20:13:10

+0

您的查詢是一個有效的mysql查詢。這是關於MySQL的問題嗎? – 2012-01-17 20:24:08

回答

1

既然你說你可能會感興趣的plyr基礎的解決方案,我可以給予是:

ddply(d, .(bid), summarise, won = sum(status==2), 
          lost = sum(status==1), count = length(bid)) 
+0

+ 1謝謝! SQL語法對我來說一直更直觀,但我喜歡這個解決方案,並且必須學習更多關於plyr的知識。 – ATMathew 2012-01-17 20:23:17

4

IF is afaik a MySQL特定的語法,而錯誤表明您正在與SQLite數據庫交談。

您應該將IF替換爲CASE,它可以在兼容ANSI SQL-92的所有DMBS上工作。

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

+1 - 關於RDBMS的好消息 – JNK 2012-01-17 20:14:51

2

這個正常的SQL是使用CASESUM - 我不這樣做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', 
... 
+0

+1 - 看起來是一樣的想法。 – 2012-01-17 20:17:43

2

編輯:問題是標籤的mysql,但我不知道是這種情況

看看MySQL Control Flow Functions。您可以使用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 
+1

+1現在我想認爲*偉大的頭腦想象一樣* 2012-01-17 20:18:24

+1

更大的頭腦類型更快我猜:) – 2012-01-17 20:28:17

0

試試這個:

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 
+0

這將無法正常工作,因爲你有不同的列在頂部和底部集... – JNK 2012-01-17 20:19:15

+0

@Tuong - 這將返回2記錄而不是一個。如果添加一個虛擬列,可以使其工作,將其包含在子查詢中,對其進行分組並處理NULL。 – 2012-01-17 20:20:17

+1

感謝您的通知,我會研究更多關於這個問題...... – 2012-01-17 20:22:08

1

if無效SQLite syntax。試試這個:

> 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