【问题标题】:Restructure Data in R在 R 中重构数据
【发布时间】:2011-03-29 01:38:49
【问题描述】:

我刚刚开始超越 R 的基础知识,并且已经到了需要一些帮助的地步。我想重组一些数据。以下是示例数据框的外观:

ID  Sex Res Contact
1   M   MA  ABR
1   M   MA  CON
1   M   MA  WWF
2   F   FL  WIT
2   F   FL  CON
3   X   GA  XYZ

我希望数据看起来像:

ID  SEX Res ABR CON WWF WIT XYZ
1   M   MA  1   1   1   0   0
2   F   FL  0   1   0   1   0
3   X   GA  0   0   0   0   1

我有哪些选择?我将如何在 R 中做到这一点?

简而言之,我希望保留 CONT 列的值并将它们用作重构数据框中的列名。我想保持一组可变的列不变(在上面的例子中,我保持 ID、Sex 和 Res 不变)。

另外,是否可以控制重组数据中的值?我可能想将数据保留为二进制。我可能希望某些数据的值是每个 ID 的每个联系人值存在的次数。

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    reshape 包是您想要的。此处的文档:http://had.co.nz/reshape/。不要自吹自擂,但我也在这里写了一些关于reshape 的使用说明:http://www.ling.upenn.edu/~joseff/rstudy/summer2010_reshape.html

    为了您的目的,这段代码应该可以工作

    library(reshape)
    data$value <- 1
    cast(data, ID + Sex + Res ~ Contact, fun = "length")
    

    【讨论】:

    • 我已经使用 R 很长时间了,我从来不知道你可以用 data$value
    • @Daniel 你也应该试试data$variable &lt;- 1; data$variable[data$Group == "A"] &lt;- 2
    • 我知道 Hadley 的重塑包可能是答案,但我很难理解它。在您的代码中,赋值为 1 的 data$value 有什么作用?
    • 对于reshape,它必须有一些测量值。该公式定义了“矩阵”,然后它查找适合每个单元格的所有值。默认情况下,它会在名为 value 的列中查找值,但您可以覆盖它。我不得不添加一个value 列,因为定义矩阵后,没有对应于测量值的列,所以我创建了一个虚拟的。如果每个单元格的值数 cast 将使用该值填充单元格。否则,它会根据某个函数聚合值,默认为length。
    • 我定义了一个聚合函数,否则,没有观察的单元格将被NA 填充。如果您想要 0,请将 value 值与 length 聚合。
    【解决方案2】:

    model.matrix 效果很好(最近有人问过这个问题,gappy had this good answer):

    > model.matrix(~ factor(d$Contact) -1)
      factor(d$Contact)ABR factor(d$Contact)CON factor(d$Contact)WIT factor(d$Contact)WWF factor(d$Contact)XYZ
    1                    1                    0                    0                    0                    0
    2                    0                    1                    0                    0                    0
    3                    0                    0                    0                    1                    0
    4                    0                    0                    1                    0                    0
    5                    0                    1                    0                    0                    0
    6                    0                    0                    0                    0                    1
    attr(,"assign")
    [1] 1 1 1 1 1
    attr(,"contrasts")
    attr(,"contrasts")$`factor(d$Contact)`
    [1] "contr.treatment"
    

    【讨论】:

    • 耳!误解了这个问题。您可以使用我的答案,然后使用tapply,但 JoFrhwld 的答案更简单。
    猜你喜欢
    • 2015-02-27
    • 2021-03-01
    • 1970-01-01
    • 2021-11-19
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多