pivot_wider,旋转所有组合

问题描述 投票:0回答:1

我有这个数据。很多人共享相同的 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 答案会很棒,但没有也没关系!

r combinations
1个回答
0
投票

给你。在这种情况下,使用多对多合并比使用更广泛的透视更容易。

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

© www.soinside.com 2019 - 2024. All rights reserved.