【问题标题】:How to transform R data from long-ish to wide-ish [duplicate]如何将 R 数据从 long-ish 转换为 wide-ish [重复]
【发布时间】:2019-11-18 06:26:19
【问题描述】:

我正在使用 R 尝试将我的数据框从“long-ish”转换为“wide-ish”,但我徒劳地寻找使用与我的结构相似的数据的答案。这是我的数据:

| ID   | NAME | V1    |  V2 |   V3 |
|------|------|-------|----:|-----:|
| 1001 | Bob  | Red   | 302 | 0.50 |
| 1001 | Bob  | Blue  | 737 | 0.50 |
| 1002 | Jim  | Red   | 432 | 0.14 |
| 1002 | Jim  | Blue  | 643 | 0.60 |
| 1002 | Jim  | Green |  34 | 0.46 |
| 1006 | Dan  | Red   | 876 | 1.25 |

这就是我希望最终数据(宽)的样子:

| ID   | NAME | V2.Red | V2.Blue | V2.Green | V3.Red | V3.Blue | V3.Green |
|------|------|-------:|--------:|---------:|-------:|--------:|---------:|
| 1001 | Bob  |    302 |     737 |      N/A |   0.50 |    0.50 |      N/A |
| 1002 | Jim  |    432 |     643 |       34 |   0.14 |    0.60 |     0.46 |
| 1006 | Dan  |    876 |     N/A |      N/A |   1.25 |     N/A |      N/A |

因此,基本上,我将所有相同的 ID 行合并为一行(附带 NAME),以便总行数等于唯一 ID 值的数量。
然后,我使用 V1 的唯一值创建与 V1 中唯一值乘以“额外变量”--V2、V3 的数量一样多的列。 (我还有很多 V2 和 V3 类型的变量。

提前致谢!

【问题讨论】:

    标签: r reshape tidyr


    【解决方案1】:

    我们可以使用新的tidyr中的pivot_wider

    tidyr::pivot_wider(df, names_from = V1, values_from = c(V2, V3))
    
    #     ID NAME  V2_Red V2_Blue V2_Green V3_Red V3_Blue V3_Green
    #  <int> <fct>  <int>   <int>    <int>  <dbl>   <dbl>    <dbl>
    #1  1001 Bob      302     737       NA   0.5      0.5    NA   
    #2  1002 Jim      432     643       34   0.14     0.6     0.46
    #3  1006 Dan      876      NA       NA   1.25    NA      NA   
    

    数据

    df <- structure(list(ID = c(1001L, 1001L, 1002L, 1002L, 1002L, 1006L
    ), NAME = structure(c(1L, 1L, 3L, 3L, 3L, 2L), .Label = c("Bob", 
    "Dan", "Jim"), class = "factor"), V1 = structure(c(3L, 1L, 3L, 
    1L, 2L, 3L), .Label = c("Blue", "Green", "Red"), class = "factor"), 
    V2 = c(302L, 737L, 432L, 643L, 34L, 876L), V3 = c(0.5, 0.5, 
    0.14, 0.6, 0.46, 1.25)), class = "data.frame", row.names = c(NA, -6L))
    

    【讨论】:

    • 非常感谢。它工作得很好!我几乎羞于承认这个周末我花了多少时间试图自己解决这个问题。
    【解决方案2】:

    为了完整起见,这里有一个data.table 解决方案

    library( data.table )
    dcast( setDT(df), ID + NAME ~ V1, value.var = c("V2","V3"), sep = "." )
    
    #      ID NAME V2.Blue V2.Green V2.Red V3.Blue V3.Green V3.Red
    # 1: 1001  Bob     737       NA    302     0.5       NA   0.50
    # 2: 1002  Jim     643       34    432     0.6     0.46   0.14
    # 3: 1006  Dan      NA       NA    876      NA       NA   1.25
    

    【讨论】:

      猜你喜欢
      • 2017-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多