使用R将行值与列名匹配

问题描述

大师

Store No. Online Pressure MON TUE WED ... Hours
   1        0.2     50     0   0   0  ...  53
   2        0.8     20     0   0   0  ...  30
   3        1.2     10     0   0   0  ...  20
   ...

小时

Branch No. Day ... Time
    1     MON     7.50
    1     TUE     6.00
    1     WED     8.50
    3     MON     2.00
    3     TUE     1.00
    3     WED     2.50
    ...

我的想法是我想从“小时”表中的数据填充“主”表中的“星期一”,“星期二”,“星期三” ...等星期几

我该如何匹配分支编号和商店编号,然后将“日期”数据与“主”列中的相应日期进行匹配。所以Master的输出应该如下

Store No. Online Pressure MON TUE WED ... Hours
   1        0.2     50   7.50 6.00 8.50  ...  53
   2        0.8     20     0   0   0  ...  30
   3        1.2     10   2.00 1.00 2.50  ...  20
   ...

它应该对每一行都执行直到所有匹配。

如果我讲得不好,我很抱歉,但是我是R的新手,所以只学习自己的方法。感谢您的帮助或修改,如果有帮助可以向其他人解释问题

  merge(
  Master[!names(Master) %in% Hours$Day],reshape(Hours,direction = "wide",idvar = "Branch No.",timevar = "Day"),by.x = "Store No.",by.y = "Branch No.",all = TRUE
 )

亲切的问候

解决方法

这是使用merge + reshape

的基本R选项
merge(
  Master[!names(Master) %in% Hours$Day],reshape(Hours,direction = "wide",idvar = "Branch No.",timevar = "Day"
  ),by.x = "Store No.",by.y = "Branch No.",all = TRUE
)

给出

  Store No. Online Pressure Hours Time.MON Time.TUE Time.WED
1         1    0.2       50    53      7.5        6      8.5
2         2    0.8       20    30       NA       NA       NA
3         3    1.2       10    20      2.0        1      2.5

其中reshapedf2从长数据帧转换为宽数据帧,而merge帮助合并数据。

数据

Master <- structure(list(`Store No.` = c(1,2,3),Online = c(0.2,0.8,1.2),Pressure = c(50,20,10),MON = c(0,0),TUE = c(0,WED = c(0,Hours = c(53,30,20)),row.names = c(NA,-3L),class = c("data.frame"))

Hours <- structure(list(`Branch No.` = c(1,1,3,Day = c("MON","TUE","WED","MON","WED"),Time = c(7.5,6,8.5,2.5)),-6L),class = c(
"data.frame"))
,

希望这会有所帮助:

> dput(Master)
structure(list(`Store No` = c(1,class = c("tbl_df","tbl","data.frame"))
> dput(Hours)
structure(list(`Branch No` = c(1,"data.frame"))
> Master
# A tibble: 3 x 7
  `Store No` Online Pressure   MON   TUE   WED Hours
       <dbl>  <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl>
1          1    0.2       50     0     0     0    53
2          2    0.8       20     0     0     0    30
3          3    1.2       10     0     0     0    20
> Hours
# A tibble: 6 x 3
  `Branch No` Day    Time
        <dbl> <chr> <dbl>
1           1 MON     7.5
2           1 TUE     6  
3           1 WED     8.5
4           3 MON     2  
5           3 TUE     1  
6           3 WED     2.5
> Master %>% pivot_longer(cols = c(MON,TUE,WED)) %>% inner_join(Hours,by = c('name' = 'Day','Store No' = 'Branch No')) %>% 
+   select(`Store No`,Online,Pressure,name,Hours,Time) %>% pivot_wider(names_from = name,values_from = Time)
# A tibble: 2 x 7
  `Store No` Online Pressure Hours   MON   TUE   WED
       <dbl>  <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl>
1          1    0.2       50    53   7.5     6   8.5
2          3    1.2       10    20   2       1   2.5
>