2012-08-04 121 views
1

如何將變量添加到for循環中的數據框中?將列添加到for循環中的數據框中

我想創建一個數據幀,其中每列是2009年和2011年

regions = c('A','APAC','CEE','LATAM','ME', 'NA', 'WE') 

# Loop through all regions, and add them as a column in my dataframe. 
for (region in regions) { 

    # create the query string 
    query_string = sprintf("SELECT date, revenue 
        FROM country_revenue 
        WHERE region = '%s' 
        AND date>='2009-01-01' 
        AND date<='2011-12-31' 
        ORDER BY date ASC 
        LIMIT 2000", region) 

    # Query the database, and assign the result to a variable. 
    assign(sprintf('rev.%s',region), mysql_query(query_string)) 

    # I only want the 2nd column returned from my query above. 
    # THIS IS THE PART THAT FAILS. Error in sprintf("rev.%s", region)[, 2] : incorrect number of dimensions 
    sprintf('rev.%s',region) = sprintf('rev.%s',region)[,2] 

    # Add this variable to my data frame. 
    revenue = cbind(revenue, sprintf('rev.%s',region)) 
} 
+0

我推測什麼不起作用的事實是,您將字符串傳遞給'cbind'而不是對象的名稱。 (雖然,即使它的工作原理是,使用'assign'並通過逐個添加列來增加數據框通常是不明智的。) – joran 2012-08-04 21:17:11

+0

感謝Joran - 我不確定創建數據框的最佳方式使用for-loop。如果你有一個建議,請讓我知道:) – 2012-08-04 21:20:22

+1

最好的方法是不使用循環!在我看來,你應該能夠使用所有區域進行查詢並且更容易地在R中過濾。然後像'dcast'從「長」到「寬」格式......是否有單獨做每個查詢的好理由?確切地說,是 – Justin 2012-08-04 21:23:52

回答

6

之間的收入中的區域將是非常低效的。爲什麼不返回region作爲SQL調用的一部分,所以你有類似

foo <- data.frame(date = rep(Sys.Date() + 0:4, 7), 
        revenue = runif(7*5), 
        region = rep(c('A','APAC','CEE','LATAM','ME', 'NA', 'WE'), 
           each = 5)) 

> head(foo) 
     date revenue region 
1 2012-08-04 0.1170867  A 
2 2012-08-05 0.6173779  A 
3 2012-08-06 0.9860934  A 
4 2012-08-07 0.1344043  A 
5 2012-08-08 0.5570391  A 
6 2012-08-04 0.5844136 APAC 

這是一個簡單dcast()調用數據重塑成所需的格式。

> require(reshape2) 
> dcast(foo, date ~ region, value.var = "revenue") 
     date   A  APAC  CEE  LATAM   ME 
1 2012-08-04 0.1170867 0.5844136 0.8011066 0.82864796 0.85856770 
2 2012-08-05 0.6173779 0.7893151 0.3991653 0.41268349 0.05925445 
3 2012-08-06 0.9860934 0.2812308 0.2272009 0.04599903 0.82367709 
4 2012-08-07 0.1344043 0.7513777 0.8022602 0.96933913 0.61501816 
5 2012-08-08 0.5570391 0.2915478 0.4601065 0.82996462 0.83779233 
     NA   WE 
1 0.4833374 0.25713295 
2 0.9574843 0.22122544 
3 0.5575645 0.03492411 
4 0.2962364 0.51973593 
5 0.9020639 0.95506837 
+2

。基於OP在前面的例子中用'paste'掙扎,我的草案答案與此不同之處僅在於包含了一個如何將所有區域粘貼在一起以便能夠將它們傳遞給查詢以便與'IN'子句一起使用的示例。 – joran 2012-08-04 21:35:31

+0

+1在我找到這個解決方案之前,我一直在掙扎很久。我的問題是如何從因子變量/列創建新列 – 2013-06-06 19:29:07

相關問題