2017-11-09 11 views
2

df의 여러 열에 다른 df의 열을 곱하려고합니다.일치하는 조건을 가진 열로 data.frame을 곱하십시오.

df1과 df2에는 "year_quarter"라는 열이 있습니다. df1의 많은 열에 df2의 열을 곱하여 year_quarter가 일치하도록합니다. year_quarter 모두 DFS에 일치합니다

year_quarter ratio 
2010Q1   0.96 
2010Q2   1.34 
2010Q3   1.92 
2010Q4   0.74 

DF2

year_quarter col1 col2 col3 
2010Q1   5  0.34 0.45 
2010Q1   4  0.45 0.34 
2010Q1   6  0.63 0.86 
2010Q1   2  0.75 0.45 
2010Q2   3  0.78 0.27 
2010Q2   5  0.43 0.38 
2010Q2   2  0.34 0.74 
2010Q2   1  0.87 0.35 
2010Q3   5  0.34 0.45 
2010Q3   8  0.54 0.42 
2010Q3   9  0.23 0.45 
2010Q3   3  0.74 0.34 
2010Q4   2  0.72 0.78 
2010Q4   7  0.62 0.91 
2010Q4   2  0.74 0.10 
2010Q4   6  0.73 0.09 

DF1 나는 DF2의 비율로 DF1에서 COL1, COL2와 COL3를 곱합니다. 즉 df1 = 2010Q1에서 quarter_year 인 경우 2010Q1의 모든 인스턴스에 대해 col1, col2 및 col3에 0.96을 곱해야합니다.

+0

불일치가있는 경우 어떤 동작이 필요합니까? , df1에 분기가 df2에 나타나지 않는다고 가정 해 봅시다. 가능한가? – agenis

+0

df1에는 있지만 df2에는없는 분기의 이름을 인쇄하고 싶습니다. –

답변

4

match을 사용하면됩니다. 두 데이터 프레임의 유사한 열을 일치시킨 다음 해당하는 ratio 값을 가져 와서 첫 번째 열을 제외한 df1에 곱합니다. 당신이 필요하지 않은 경우

df2$ratio[match(df1$year_quarter, df2$year_quarter)] * df1[-1] 


# col1 col2 col3 
#1 4.80 0.3264 0.4320 
#2 3.84 0.4320 0.3264 
#3 5.76 0.6048 0.8256 
#4 1.92 0.7200 0.4320 
#5 4.02 1.0452 0.3618 
#6 6.70 0.5762 0.5092 
#7 2.68 0.4556 0.9916 
#8 1.34 1.1658 0.4690 
#9 9.60 0.6528 0.8640 
#10 15.36 1.0368 0.8064 
#11 17.28 0.4416 0.8640 
#12 5.76 1.4208 0.6528 
#13 1.48 0.5328 0.5772 
#14 5.18 0.4588 0.6734 
#15 1.48 0.5476 0.0740 
#16 4.44 0.5402 0.0666 
1

사용 dplyr, 당신은 두 데이터 세트를 병합 한 후 원하는 컬럼의 값을 변경하는 돌연변이 체 기능을 적용, 결국 당신은 비 열을 제거 할 수 있습니다 %>% select(-ratio)

library(dplyr) 
left_join(df1, df2) %>% mutate_at(vars(starts_with("col")), funs(.*ratio)) 

왼쪽 조인 동작은 예를 들어 첫 번째 data.frame에 2011 년 날짜가있는 경우 NA 행을 남겨 둡니다 (Ronak의 대답과 동일)

+0

'sweep' 기능을 사용할 수도 있지만 간단하지는 않습니다. – agenis