复制行以匹配新的数据框
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), ]
我正在使用 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), ]