复制行以匹配新的数据框

Duplicating rows to match a new data frame

我正在使用 R,我有两个相关的 tibbles(数据帧),但现在它们是分开的。对于第一个小标题的每一行,它们是与该小标题相关的十 (10) 行或更少的行。所以,我的第一个 tibble 看起来像这样...

A  0.1
B  0.2
C  0.3
D  0.4
E  0.5

第二个标题看起来像这样...

A  1.5
A  1.6
A  1.7
A  1.8
A  1.9
B  2.5
B  2.6
B  2.7
B  2.8
B  2.9
C  3.1
C  3.3
D  4.4
D  4.6
E  6.6
E  6.7

因此,我需要复制第一个小标题的值以匹配第二个小标题。所以,我需要第一个 tibble 看起来像这样...

A  0.1
A  0.1
A  0.1
A  0.1
A  0.1
B  0.2
B  0.2
B  0.2
B  0.2
B  0.2
C  0.3
C  0.3
D  0.4
D  0.4
E  0.5
E  0.5

我遇到的问题是在第二个小标题上重复值的次数不一致。因此,有时第一个小标题的值需要重复 x5 次、x2 次等。

如果需要以不一致的方式复制第一个小标题的值,我该如何复制它们。有 5 个,有 2 个,有 3 个等等

*第一个小标题有 600 个值。

您可以 count df2 中的值,加入 df1 并使用 uncount 重复行。

library(dplyr)

df2 %>%
  count(V1) %>%
  left_join(df1, by = 'V1') %>%
  tidyr::uncount(n)

数据

df1 <- structure(list(V1 = c("A", "B", "C", "D", "E"), V2 = c(0.1, 0.2, 
0.3, 0.4, 0.5)), class = "data.frame", row.names = c(NA, -5L))

df2 <- structure(list(V1 = c("A", "A", "A", "A", "A", "B", "B", "B", 
"B", "B", "C", "C", "D", "D", "E", "E"), V2 = c(1.5, 1.6, 1.7, 
1.8, 1.9, 2.5, 2.6, 2.7, 2.8, 2.9, 3.1, 3.3, 4.4, 4.6, 6.6, 6.7
)), class = "data.frame", row.names = c(NA, -16L))

Select 仅 tibble2 的第一列然后与 tibble1 左连接。

library(tidyverse)

tibble2 %>%
    select(col1) %>%
    left_join(tibble1, by = 'col1')

这里有一个 dplyr 方式和一个 base 方式。不确定您如何处理 non-matches.

library(dplyr)

df1 = tibble(ID = LETTERS[1:5]
             , val = seq(0.1, 0.5, by = 0.1))

s = sample(5)
df2 = tibble(ID = rep(LETTERS[1:5], s),
             val2 = rep(s, s) + 0.1 * sequence(s))

inner_join(df1, df2)%>%
  select(-val2)

## base
tbl = table(df2$ID)
df1[rep(match(df1$ID, names(tbl)), tbl), ]