2012-08-04 5 views
1

for 루프의 데이터 프레임에 변수를 추가하는 방법은 무엇입니까?for 루프의 데이터 프레임에 열 추가

나는 각 열에 매우 비효율적 2009

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'에 문자열을 전달한다는 것입니다. (비록 그것이 작동하더라도, '할당'을 사용하고 한 번에 하나씩 열을 추가하여 데이터 프레임을 늘리는 것은 일반적으로 현명하지 않습니다.) – joran

+0

감사합니다. Joran - 데이터 프레임을 만드는 최선의 방법이 확실하지 않습니다. for-loop를 사용한다. 제안이 있으시면 알려주십시오 :) –

+1

가장 좋은 방법은 루프를 사용하지 않는 것입니다! 모든 지역을 사용하고 R에서 필터를 훨씬 쉽게 사용하여 쿼리를 수행 할 수 있어야합니다. 그런 다음 '길다'에서 '와이드'형식으로 이동하는 'dcast'와 같은 것이 ... 각 쿼리를 개별적으로 수행해야하는 충분한 이유가 있습니까? – Justin

답변

6

2011 년 사이의 영역에 대한 수익입니다 dataframe를 작성하고 싶습니다. 당신이

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() 호출입니다 뭔가를 그래서 왜 SQL 호출의 일부로 region을 반환하지.

> 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의 '붙여 넣기'에 기반하여 초안을 작성한 답변은 모든 지역을 붙여 넣어 'IN'절과 함께 사용할 수있는 쿼리를 전달할 수있는 방법의 예를 포함하는 것과 다릅니다. – joran

+0

+1이 솔루션을 사용하기 전에 오랜 시간 애써 왔습니다. 내 질문은 요소 변수/열에서 새 열을 만드는 방법이었다. –