我有这个数据。很多人共享相同的 ID,但记录的有关自己的详细信息不同(姓名和月份通常不同)。
data.frame(
id = c("a", "a", "a", "a", "b", "b"),
name = c("jane", "laura", "lauran", "lilly", "james", "jimmy"),
month = c("april", "april", "may", "june", "june", "june")
)
id | 名字 | 月 |
---|---|---|
a | 简 | 四月 |
a | 劳拉 | 四月 |
a | 劳兰 | 可能 |
a | 莉莉 | 六月 |
b | 詹姆斯 | 六月 |
b | 吉米 | 六月 |
我想要一种更广泛的旋转方式,因此每个 id 的名称的每个组合都会出现(注意:如果有更好的方法,则不需要使用pivot_wider)。
该数据实际上有 1000 行。
id | 名称_1 | 名称_2 | month_1 | 月_2 | 笔记 |
---|---|---|---|---|---|
a | 简 | 劳拉 | 四月 | 四月 | |
a | 简 | 劳兰 | 四月 | 可能 | |
a | 简 | 莉莉 | 四月 | 六月 | |
a | 劳拉 | 简 | 四月 | 四月 | * 见下文 |
a | 劳拉 | 劳兰 | 四月 | 可能 | |
a | 劳拉 | 莉莉 | 四月 | 六月 | |
a | 劳兰 | 简 | 可能 | 四月 | |
a | 劳兰 | 劳拉 | 可能 | 四月 | |
a | 劳兰 | 莉莉 | 可能 | 六月 | |
a | 莉莉 | 简 | 六月 | 四月 | |
a | 莉莉 | 劳拉 | 六月 | 四月 | |
a | 莉莉 | 劳兰 | 六月 | 可能 | |
b | 詹姆斯 | 吉米 | 六月 | 六月 | |
b | 吉米 | 詹姆斯 | 六月 | 六月 |
*理想的解决方案不会有这一行,因为这个名称组合 lauran/jane 已经出现在第 1 行 jane/lauran 等未来行中。 不过,如果我们能做到这一点,这个解决方案就可以了。
某种 dplyr 答案会很棒,但没有也没关系!
给你。在这种情况下,使用多对多合并比使用更广泛的透视更容易。
library(dplyr, warn.conflicts = FALSE) |>
suppressWarnings()
dat <- data.frame(
id = c(rep("a", 4), rep("b",2)),
name = c("jane", "laura", "lauran", "lilly", "james", "jimmy"),
month = c("april", "april", "may", rep("june",3))
)
dat |>
group_by(id) |>
mutate(row = row_number()) %>% # Created to allow filtering later.
left_join(., ., by = "id", relationship = "many-to-many", suffix = c("_1", "_2")) |>
filter(row_2 > row_1) |>
select(id, starts_with("name"), starts_with("month"))
#> # A tibble: 7 × 5
#> # Groups: id [2]
#> id name_1 name_2 month_1 month_2
#> <chr> <chr> <chr> <chr> <chr>
#> 1 a jane laura april april
#> 2 a jane lauran april may
#> 3 a jane lilly april june
#> 4 a laura lauran april may
#> 5 a laura lilly april june
#> 6 a lauran lilly may june
#> 7 b james jimmy june june
创建于 2024-10-28,使用 reprex v2.1.1