我正在使用一个大致如下所示的数据集:
身份证 | 测量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,然后执行长到宽的转换,但它并没有真正起作用。
尝试一下
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