R 以多对多关系重塑高到宽 table
R reshape tall to wide with many to many relationship table
我有一个 table 和 parent 以及他或她的 child 的信息(姓名、年级、年龄)。一个child可以有多个parent,一个parent可以有多个children。我想重塑 table,这样每一行都是唯一的 parent,他或她的所有 children 的信息都标记为 .1、,2 等
原文Table:
ParentID
ChildN
ChildGrade
ChildAge
HouseholdID
1
x
10
21
a
2
x
10
21
a
3
z
12
23
b
1
y
13
24
a
2
y
13
24
a
3
t
15
26
b
4
g
16
27
c
目标:
ParentID
ChildN.1
ChildGrade.1
ChildAge.1
ChildN.2
ChildGrade.2
ChildAge.2
HouseholdID
1
x
10
21
y
13
24
a
2
x
10
21
y
13
24
a
3
z
12
23
t
15
26
b
4
g
16
27
NA
NA
NA
c
我想知道如何在 R 中实现这一点。非常感谢。
您可以使用 tidyr::pivot_wider
实现您想要的结果,方法是首先为 children 添加一个 id 列:
library(dplyr)
library(tidyr)
df |>
group_by(ParentID) |>
mutate(child_id = row_number()) |>
pivot_wider(values_from = c("ChildN", "ChildGrade", "ChildAge"), names_from = "child_id",
names_glue = "{.value}.{child_id}")
#> # A tibble: 4 × 8
#> # Groups: ParentID [4]
#> ParentID HouseholdID ChildN.1 ChildN.2 ChildGrade.1 ChildGrade.2 ChildAge.1
#> <int> <chr> <chr> <chr> <int> <int> <int>
#> 1 1 a x y 10 13 21
#> 2 2 a x y 10 13 21
#> 3 3 b z t 12 15 23
#> 4 4 c g <NA> 16 NA 27
#> # … with 1 more variable: ChildAge.2 <int>
我有一个 table 和 parent 以及他或她的 child 的信息(姓名、年级、年龄)。一个child可以有多个parent,一个parent可以有多个children。我想重塑 table,这样每一行都是唯一的 parent,他或她的所有 children 的信息都标记为 .1、,2 等
原文Table:
ParentID | ChildN | ChildGrade | ChildAge | HouseholdID |
---|---|---|---|---|
1 | x | 10 | 21 | a |
2 | x | 10 | 21 | a |
3 | z | 12 | 23 | b |
1 | y | 13 | 24 | a |
2 | y | 13 | 24 | a |
3 | t | 15 | 26 | b |
4 | g | 16 | 27 | c |
目标:
ParentID | ChildN.1 | ChildGrade.1 | ChildAge.1 | ChildN.2 | ChildGrade.2 | ChildAge.2 | HouseholdID |
---|---|---|---|---|---|---|---|
1 | x | 10 | 21 | y | 13 | 24 | a |
2 | x | 10 | 21 | y | 13 | 24 | a |
3 | z | 12 | 23 | t | 15 | 26 | b |
4 | g | 16 | 27 | NA | NA | NA | c |
我想知道如何在 R 中实现这一点。非常感谢。
您可以使用 tidyr::pivot_wider
实现您想要的结果,方法是首先为 children 添加一个 id 列:
library(dplyr)
library(tidyr)
df |>
group_by(ParentID) |>
mutate(child_id = row_number()) |>
pivot_wider(values_from = c("ChildN", "ChildGrade", "ChildAge"), names_from = "child_id",
names_glue = "{.value}.{child_id}")
#> # A tibble: 4 × 8
#> # Groups: ParentID [4]
#> ParentID HouseholdID ChildN.1 ChildN.2 ChildGrade.1 ChildGrade.2 ChildAge.1
#> <int> <chr> <chr> <chr> <int> <int> <int>
#> 1 1 a x y 10 13 21
#> 2 2 a x y 10 13 21
#> 3 3 b z t 12 15 23
#> 4 4 c g <NA> 16 NA 27
#> # … with 1 more variable: ChildAge.2 <int>