在 R 中,如何在处理识别变量的重复值时将数据从长数据转换为宽数据?

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

我正在使用一个大致如下所示的数据集:

身份证 测量A 测量B
1 3 1
2 10 0
2 4 3
3 3 11
4 7 10
4 8 4
4 9 6
5 19 11
5 11 8
6 5 9

...

我需要的是一个输出表,其中每个 ID 变量仅包含一次,并且具有所需数量的测量 A 和测量 B 列。考虑到某些 ID 不重复,并且它们重复的次数并不总是相同,如示例所示。 预期的输出表看起来像这样:

身份证 测量A1 测量A2 测量A3 测量B1 测量B2 测量B3
1 3 不适用 不适用 1 不适用 不适用
2 10 4 不适用 0 3 不适用
3 3 不适用 不适用 11 不适用 不适用
4 7 8 9 10 4 6
5 19 11 不适用 11 8 不适用
6 5 不适用 不适用 9 不适用 不适用

...

我已经被这个问题困扰了一段时间。谁能帮我在 RStudio 中做到这一点?谢谢!

我尝试使用duplicate函数来区分重复的ID,然后执行长到宽的转换,但它并没有真正起作用。

r transform
1个回答
0
投票

尝试一下

tidyr
dplyr

library(tidyr)
library(dplyr)

df <- data.frame(
  ID = c(1, 2, 2, 3, 4, 4, 4, 5, 5, 6),
  MeasureA = c(3, 10, 4, 3, 7, 8, 9, 19, 11, 5),
  MeasureB = c(1, 0, 3, 11, 10, 4, 6, 11, 8, 9)
)

df |> 
  pivot_longer(MeasureA:MeasureB) |> 
  group_by(ID, name) |> 
  mutate(name = paste0(name, row_number())) |> 
  pivot_wider(names_from = name, values_from = value)
#> # A tibble: 6 × 7
#> # Groups:   ID [6]
#>      ID MeasureA1 MeasureB1 MeasureA2 MeasureB2 MeasureA3 MeasureB3
#>   <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
#> 1     1         3         1        NA        NA        NA        NA
#> 2     2        10         0         4         3        NA        NA
#> 3     3         3        11        NA        NA        NA        NA
#> 4     4         7        10         8         4         9         6
#> 5     5        19        11        11         8        NA        NA
#> 6     6         5         9        NA        NA        NA        NA

创建于 2023-10-30,使用 reprex v2.0.2

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