【问题标题】:Using the reshape function in R with multiple matching rows在具有多个匹配行的 R 中使用 reshape 函数
【发布时间】:2015-05-08 22:17:56
【问题描述】:

所以我有以下数据框df

       X     Y     Z     ID     value
1      0    20    135    a       20
2      0    20    135    a       30
3      0    20    135    b       40
4      20   104    20    c       10
5      20   104    20    b       15
...

我想要一个最终输出

       X     Y     Z     a     b     c     
1      0    20    135    20    40    null
2      0    20    135    30    null  null
3      20   104    20    null  15    10
...

我想将所有不同的 ID 转换为包含原始数据框中值的单独列。我目前正在做的是 reshape(df, idvar=c("X", "Y", "Z"), timevar="ID", direction="wide")。但是,这会导致警告:abc 中的每一个都有多行匹配,因此只采用第一行。我希望每个独特的XYZ 组合都有一行,但由于有很多重复测量,我也希望每个组合都有多行,但是每个 a、@ 的重复测量次数不同987654332@,和c。有没有办法有效地做到这一点?

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    您已经确定了问题的答案:您需要添加一个辅助“id”变量。这可以通过我的“splitstackshape”包中的getanID 轻松完成。它的作用如下:

    library(splitstackshape)
    getanID(mydf, c("X", "Y", "Z", "ID"))
    #     X   Y   Z ID value .id
    # 1:  0  20 135  a    20   1
    # 2:  0  20 135  a    30   2
    # 3:  0  20 135  b    40   1
    # 4: 20 104  20  c    10   1
    # 5: 20 104  20  b    15   1
    

    考虑到这一点,您将如何更改当前的 reshape 方法:

    reshape(getanID(mydf, c("X", "Y", "Z", "ID")), 
            direction = "wide", idvar = c("X", "Y", "Z", ".id"), timevar = "ID")
    #     X   Y   Z .id value.a value.b value.c
    # 1:  0  20 135   1      20      40      NA
    # 2:  0  20 135   2      30      NA      NA
    # 3: 20 104  20   1      NA      15      10
    

    或者,由于“data.table”也加载了“splitstackshape”,你可以使用dcast.data.table,像这样:

    dcast.data.table(getanID(mydf, c("X", "Y", "Z", "ID")),
                     X + Y + Z + .id ~ ID, value.var = "value")
    #     X   Y   Z .id  a  b  c
    # 1:  0  20 135   1 20 40 NA
    # 2:  0  20 135   2 30 NA NA
    # 3: 20 104  20   1 NA 15 10
    

    【讨论】:

    • 如果我希望将 b 列的值 40 分配给所有 id 怎么办? (1:和 2:也)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2017-10-22
    相关资源
    最近更新 更多