Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将data.frame乘以具有匹配条件的列_R_Dataframe_Merge_Mapping_Multiplication - Fatal编程技术网

将data.frame乘以具有匹配条件的列

将data.frame乘以具有匹配条件的列,r,dataframe,merge,mapping,multiplication,R,Dataframe,Merge,Mapping,Multiplication,我想把一个df中的几列乘以另一个df中的一列 df1和df2有一个名为“年/季”的列。我希望df1中的许多列与df2中的一列相乘,以便年度和季度匹配 df1 df2 我想将df1中的col1、col2和col3乘以df2中的比率,其中年/季度在两个dfs中匹配。i、 e.如果df1中的季度年=2010Q1,那么对于2010Q1的所有实例,col1、col2和col3应乘以0.96,以此类推 我们可以使用match进行匹配。匹配两个数据帧中的相似列,然后获得相应的比率值,并将其乘以df1,不包括第

我想把一个df中的几列乘以另一个df中的一列

df1和df2有一个名为“年/季”的列。我希望df1中的许多列与df2中的一列相乘,以便年度和季度匹配

df1

df2


我想将df1中的col1、col2和col3乘以df2中的比率,其中年/季度在两个dfs中匹配。i、 e.如果df1中的季度年=2010Q1,那么对于2010Q1的所有实例,col1、col2和col3应乘以0.96,以此类推

我们可以使用
match
进行匹配。匹配两个数据帧中的相似列,然后获得相应的
比率
值,并将其乘以
df1
,不包括第1列

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

使用dplyr,您可以合并两个数据集,然后应用mutate函数更改所需列的值,如果不需要,最终可以使用
%%>%select(-ratio)


左连接行为是这样的,例如,如果您的第一个data.frame中有一个2011年的日期,它将离开行NA(Ronak的回答中的相同行为)

如果存在不匹配,您希望采取什么行为,比如说df1中有一个季度没有出现在df2中?有可能吗?我想打印df1中存在但df2中不存在的季度名称,有可能吗?我想您也可以使用
sweep
功能,但不那么简单
year_quarter    ratio
2010Q1          0.96
2010Q2          1.34
2010Q3          1.92
2010Q4          0.74
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
library(dplyr)
left_join(df1, df2) %>% mutate_at(vars(starts_with("col")), funs(.*ratio))