2014-02-14 20 views
0

看到我有data.frame這樣的:SQLDF如何添加新的vetors?

str(veh) 
$VEHAGE int 3 6 35 35 5 3 7 4 5 1 ... 
$VEHTYPE int 2 1 3 1 2 3 1 4 2 3 ... 

然後我跑

a<-sqldf("SELECT VEHAGE, COUNT(VEHAGE) as count1 
          FROM veh 
          WHERE VEHTYPE==1 
          GROUP BY VEHAGE") 


a<-sqldf("SELECT VEHAGE, COUNT(VEHAGE) as count234 
          FROM veh 
          WHERE VEHTYPE==2|3|4 
          GROUP BY VEHAGE") 

我得到的結果是這樣

head(a) 
    VEHAGE count234 
1  -9  92 
2  1  79 
3  2 164 
4  3 212 
5  4 260 
6  5 199 

我在這種情況下失去COUNT1。但我想要一個像這樣的頭(一)

VEHAGE count1 count234 
1  -9  92 510 
2  1  79 844 
3  2 164 123 
4  3 212 123 
5  4 260 100 
6  5 199 100 

任何想法?提前致謝!

+1

當你第二次調用'sqldf'時,你會覆蓋'a'。這就是你失去'count1'的原因。 – rrs

回答

2

我想你正在尋找這樣的:

# first query 
a <- sqldf("SELECT VEHAGE, COUNT(VEHAGE) as count1 
          FROM veh 
          WHERE VEHTYPE==1 
          GROUP BY VEHAGE") 

# second query 
b <- sqldf("SELECT VEHAGE, COUNT(VEHAGE) as count234 
          FROM veh 
          WHERE VEHTYPE IN (2, 3, 4) 
          GROUP BY VEHAGE") 

# combine 
a <- sqldf("SELECT * 
      FROM a JOIN b 
      USING (VEHAGE)") 
+1

我認爲如果兩個組有不同的行數(例如,某個VEHTYPE == 1可能是該組獨有的年齡),您必須進行「合併」。 – BrodieG

+0

@BrodieG謝謝你指出這一點。我改變了我的方法。 –

+0

謝謝你們兩位。有用!是的,我應該合併,因爲一些組沒有年齡-9,組合功能完美。 – user3311486

0

試着這麼做:

a<-sqldf(
"SELECT VEHAGE, 
    SUM(if(VEHTYPE==1, 1, 0)) as count1, 
    SUM(if(VEHTYPE==2|3|4, 1, 0)) as count234 
    FROM veh 
    GROUP BY VEHAGE") 

雖然聲明,我不熟悉sqldf語法,但像這樣的工作, MySQL(儘管在MySQL ==2|3|4中必須是in(2, 3, 4))。

此外,您可能需要添加諸如HAVING count1 | count234之類的東西來擺脫VEHAGE,並且這些類別中沒有車輛。

+0

sqldf使用的SQL語法取決於您正在使用的後端。默認情況下,它使用SQLite,但也可以使用H2,MySQL和PostgreSQL。 –

+0

@ G.Grothendieck,很高興知道,謝謝。 – BrodieG

+0

謝謝!很高興知道 – user3311486