2012-08-04 118 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

相关问题