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

oalqel3c  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(70)

我正在处理一个数据集,大致如下所示:
| ID|测量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不重复,并且它们重复的次数并不总是相同,如示例所示。预期的输出表看起来像这样:
| ID|测量A1|测量A2|测量A3|测量B1|测量B2|测量B3|
| --|--|--|--|--|--|--|
| 1 | 3 |NA| NA| 1 |NA| NA|
| 2 | 10 | 4 |NA| 0 | 3 |NA|
| 3 | 3 |NA| NA| 11 |NA| NA|
| 4 | 7 | 8 | 9 | 10 | 4 | 6 |
| 5 | 19 | 11 |NA| 11 | 8 |NA|
| 6 | 5 |NA| NA| 9 |NA| NA|
...
我一直在这个问题上卡住了一段时间。谁能帮助我在RStudio中做到这一点?谢谢!
我尝试使用duplicate函数来区分重复的ID,然后执行长到宽的转换,但它实际上并不起作用。

ilmyapht

ilmyapht1#

尝试tidyrdplyr

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

a5g8bdjr

a5g8bdjr2#

使用base R,您可以首先使用aveID s内分配索引,然后使用reshape将字符串转换为宽格式,例如,

reshape(
  transform(
    df,
    g = ave(ID, ID, FUN = seq_along)
  ),
  direction = "wide",
  idvar = "ID",
  timevar = "g"
)

字符串
你将获得

ID MeasureA.1 MeasureB.1 MeasureA.2 MeasureB.2 MeasureA.3 MeasureB.3
1   1          3          1         NA         NA         NA         NA
2   2         10          0          4          3         NA         NA
4   3          3         11         NA         NA         NA         NA
5   4          7         10          8          4          9          6
8   5         19         11         11          8         NA         NA
10  6          5          9         NA         NA         NA         NA

相关问题