cbind 工作日匹配的两个数据帧

cbind two dataframes where weekdays match

在提问之前,我已经搜索并阅读了许多关于 Whosebug 的其他问题,并尝试了 dplyr 包中的 joins,但 none 给出了我想要的结果。

我有两个 dfs 并想将它们组合起来,df1$col1 中的第一个值 Weddf2$col3 中第一次出现的 Wed 匹配,然后这两个dfs合并如图df3

df1 <- data.frame(col1 = c('Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon',
                           'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun',
                           'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat',
                           'Sun', 'Mon', 'Tue'),
                  col2 = c(102, 101, 100, 107, 91, 80, 80, 68, 65, 69,
                           69, 74, 66, 58, 59, 64, 76, 70, 73, 71, 60))

df2 <- data.frame(col3 = c('Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun',
                           'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 
                           'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 
                           'Sat', 'Sun', 'Mon'),
                  col4 = c(107, 91, 70, 73, 71, 80, 80, 58, 59, 64, 68,
                           65, 102, 101, 100, 69, 69, 74, 66, 76, 60))

这就是我想要的!

df3 <- data.frame(col1 = c('Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue'), 
col2 = c(102, 101, 100, 107, 91, 80, 80, 68, 65, 69, 69, 74, 66, 58, 59, 64, 76, 70, 73, 71, 60),
col3 = c('Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun', 'Mon', NA),
col4 = c(91, 70, 73, 71, 80, 80, 58, 59, 64, 68, 65, 102, 101, 100, 69, 69, 74, 66, 76, 60, NA))

col1 col2 col3 col4
Wed  102  Wed   91
Thu  101  Thu   70
Fri  100  Fri   73
Sat  107  Sat   71
Sun   91  Sun   80
Mon   80  Mon   80
Tue   80  Tue   58
Wed   68  Wed   59
Thu   65  Thu   64
Fri   69  Fri   68
Sat   69  Sat   65
Sun   74  Sun  102
Mon   66  Mon  101
Tue   58  Tue  100
Wed   59  Wed   69
Thu   64  Thu   69
Fri   76  Fri   74
Sat   70  Sat   66
Sun   73  Sun   76
Mon   71  Mon   60
Tue   60  NA    NA

重要的部分是让 df2 删除 df2$col3 中的行,直到它与 df1$col1

中的工作日匹配

解决方法: 我使用了 gdata 包中的 cbindX 函数 df3 = cbindX(df1, df2)

我们可以分两步完成:

找到df2到df1的第一个匹配条目 cbind 他们用 NA 填充空条目。有几种方法可以绑定不等长的数据帧。你可以找到一些 here。我选择使用 qpcr:::cbind.na()

i1 <- which(df1$col1[1] == df2$col3)[1]
qpcR:::cbind.na(df1, df2[i1:nrow(df2),])

这给出了,

   col1 col2 col3 col4
2   Wed  102  Wed   91
3   Thu  101  Thu   70
4   Fri  100  Fri   73
5   Sat  107  Sat   71
6   Sun   91  Sun   80
7   Mon   80  Mon   80
8   Tue   80  Tue   58
9   Wed   68  Wed   59
10  Thu   65  Thu   64
11  Fri   69  Fri   68
12  Sat   69  Sat   65
13  Sun   74  Sun  102
14  Mon   66  Mon  101
15  Tue   58  Tue  100
16  Wed   59  Wed   69
17  Thu   64  Thu   69
18  Fri   76  Fri   74
19  Sat   70  Sat   66
20  Sun   73  Sun   76
21  Mon   71  Mon   60
1   Tue   60 <NA>   NA

你可以试试这个:

library(dplyr)

new_df1 <- df1 %>% 
  mutate(row_index = row_number()) %>%
  arrange(col1,row_index) %>%
  group_by(col1) %>%
  mutate(week = row_number()) %>% 
  ungroup() %>% mutate(day = paste(col1, week, sep= "_")) %>% 
  arrange(row_index)
new_df2 <- df2 %>% 
  mutate(row_index = row_number()) %>%
  arrange(col3,row_index) %>%
  group_by(col3) %>%
  mutate(week = row_number()) %>% 
  ungroup() %>% mutate(day = paste(col3, week, sep= "_")) %>% 
  arrange(row_index)

df <- new_df1 %>%
  full_join(new_df2,by = c("day" = "day")) %>% 
  select(col1, col2, col3, col4)