问题描述
大师
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
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
其中reshape
将df2
从长数据帧转换为宽数据帧,而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
>