如何将数据从长格式转换为宽格式,以便将重复行添加到末尾以在 R 中创建新列?
How to turn data from long to wide format so that duplicate rows get added to the end to make new columns in R?
我得到了以下数据。
ID NAME STATUS OKR_T OKR_N NR
1 Jack 1 34 OK1 0
1 Jack 1 433 OK2 0
1 Jack 1 12 OK3 1
2 Bill 2 34 OK1 1
3 Steve 1 433 OK2 1
3 Steve 1 34 OK1 0
3 Steve 1 45 OK4 0
我需要得到这个:
ID NAME STATUS OKR_T.x OKR_N.x NR.x OKR_T.y OKR_N.y NR.y OKR_T.z OKR_N.z NR.z
1 Jack 1 34 OK1 0 433 OK2 0 12 OK3 1
2 Bill 2 34 OK1 1
3 Steve 1 433 OK2 1 34 OK1 0 45 OK4 0
我把 .x ; .y 和 .z 到列名的末尾,因为如果我没记错的话,这就是 R 命名具有相同名称的列的方式。对我来说,重复列的确切命名方式并不重要,只要我能分辨出 OKR_T 的区别即可; OKR_N 和 NR 来自同一个原始行。
我在 R 方面的经验有限,到目前为止,我已经使用 dcast 将我的数据从长到宽重塑,但我无法使用它。由于逻辑不同,我认为我需要另一种方法来做到这一点。
感谢您的帮助:)
library(tidyverse)
df <- read.table(
text = "ID NAME STATUS OKR_T OKR_N NR
1 Jack 1 34 OK1 0
1 Jack 1 433 OK2 0
1 Jack 1 12 OK3 1
2 Bill 2 34 OK1 1
3 Steve 1 433 OK2 1
3 Steve 1 34 OK1 0
3 Steve 1 45 OK4 0",
header = T
)
df %>%
group_by(ID) %>%
mutate(rid = row_number()) %>%
pivot_wider(
id_cols = c(ID, NAME, STATUS),
names_from = rid,
values_from = c(OKR_T, OKR_N, NR)
)
#> # A tibble: 3 x 12
#> # Groups: ID [3]
#> ID NAME STATUS OKR_T_1 OKR_T_2 OKR_T_3 OKR_N_1 OKR_N_2 OKR_N_3 NR_1 NR_2
#> <int> <chr> <int> <int> <int> <int> <chr> <chr> <chr> <int> <int>
#> 1 1 Jack 1 34 433 12 OK1 OK2 OK3 0 0
#> 2 2 Bill 2 34 NA NA OK1 <NA> <NA> 1 NA
#> 3 3 Steve 1 433 34 45 OK2 OK1 OK4 1 0
#> # ... with 1 more variable: NR_3 <int>
由 reprex package (v2.0.1)
于 2021-09-08 创建
我得到了以下数据。
ID NAME STATUS OKR_T OKR_N NR 1 Jack 1 34 OK1 0 1 Jack 1 433 OK2 0 1 Jack 1 12 OK3 1 2 Bill 2 34 OK1 1 3 Steve 1 433 OK2 1 3 Steve 1 34 OK1 0 3 Steve 1 45 OK4 0
我需要得到这个:
ID NAME STATUS OKR_T.x OKR_N.x NR.x OKR_T.y OKR_N.y NR.y OKR_T.z OKR_N.z NR.z 1 Jack 1 34 OK1 0 433 OK2 0 12 OK3 1 2 Bill 2 34 OK1 1 3 Steve 1 433 OK2 1 34 OK1 0 45 OK4 0
我把 .x ; .y 和 .z 到列名的末尾,因为如果我没记错的话,这就是 R 命名具有相同名称的列的方式。对我来说,重复列的确切命名方式并不重要,只要我能分辨出 OKR_T 的区别即可; OKR_N 和 NR 来自同一个原始行。
我在 R 方面的经验有限,到目前为止,我已经使用 dcast 将我的数据从长到宽重塑,但我无法使用它。由于逻辑不同,我认为我需要另一种方法来做到这一点。
感谢您的帮助:)
library(tidyverse)
df <- read.table(
text = "ID NAME STATUS OKR_T OKR_N NR
1 Jack 1 34 OK1 0
1 Jack 1 433 OK2 0
1 Jack 1 12 OK3 1
2 Bill 2 34 OK1 1
3 Steve 1 433 OK2 1
3 Steve 1 34 OK1 0
3 Steve 1 45 OK4 0",
header = T
)
df %>%
group_by(ID) %>%
mutate(rid = row_number()) %>%
pivot_wider(
id_cols = c(ID, NAME, STATUS),
names_from = rid,
values_from = c(OKR_T, OKR_N, NR)
)
#> # A tibble: 3 x 12
#> # Groups: ID [3]
#> ID NAME STATUS OKR_T_1 OKR_T_2 OKR_T_3 OKR_N_1 OKR_N_2 OKR_N_3 NR_1 NR_2
#> <int> <chr> <int> <int> <int> <int> <chr> <chr> <chr> <int> <int>
#> 1 1 Jack 1 34 433 12 OK1 OK2 OK3 0 0
#> 2 2 Bill 2 34 NA NA OK1 <NA> <NA> 1 NA
#> 3 3 Steve 1 433 34 45 OK2 OK1 OK4 1 0
#> # ... with 1 more variable: NR_3 <int>
由 reprex package (v2.0.1)
于 2021-09-08 创建