【问题标题】:Condensing multiple observations on the same individual into a single row, adding multiples as new columns将同一个人的多个观察结果压缩为一行,将多个观察结果添加为新列
【发布时间】:2014-02-03 21:32:35
【问题描述】:

我的数据如下所示:

ID  X1    X2    X3

1   1.4   2     two
2   7.6   30    thirty
2   7.6   50    fifty
2   7.6   40    forty
3   5.6   40    forty
3   5.6   50    fifty
4   3.5   NA    NA
5   NA    2     two

ID 表示个体,X1 是对每个个体进行一次测量,X2 和 X3 是相同处理的字符和字符串表示。例如,对于个人 2,X1= 7.6,并接受了 X2 = 30、50 和 40 的治疗(与其他信息相关,X3 = 三十、五十和四十)

我希望它最终看起来像这样,每个人只有一行,并且来自同一个人的多个观察值添加为新列:

ID   X1     X2a   X3a       X2b   X3b     X2c  X3c
1    1.4    2     two       NA    NA      NA   NA
2    7.6    30    thirty    50    fifty   40   forty
3    5.6    40    forty     50    fifty   NA   NA
4    3.5    NA    NA        NA    NA      NA   NA
5    NA     2     two       NA    NA      NA   NA

我想保留 X1=NA 的行(如主题 5),因为这些行在其他列中具有感兴趣的测量值,为了我的示例的简单性而大部分被排除在外。 我的实际数据集非常大(10,000 行,可能有 50 列),因此可以有效处理相当大数据集的方法将是一个加分项。

我一直在使用 reshape 包中的 melt() 和 cast() ,我认为这可以做我想做的事。但是,我收到一个错误,需要我进行聚合(错误:聚合需要 fun.aggregate:默认使用的长度),我不想这样做。获得熔体和铸件合作的建议?还是更好的方法?

我发现了许多类似的问题(例如,this one),但似乎没有一个可以解决我的问题,因为它们不是从相似的数据结构开始的,或者它们不关心数据的哪些实例最终匹配到哪个...

【问题讨论】:

  • 我讨厌成为这个人,但知道你为什么这样做会有所帮助。你是想绘制数据,还是做一个线性模型,还是什么?因为如果其中任何一个是目标,那么它当前的形状可能是合适的。
  • @AndrewBarr,我的目标是通过 X2 的各种条件比较 X1 的测量值(t 检验,跟进线性或其他适当的模型)并制作相应的图。我想避免两次计算来自同一个人 (ID) 的 X1 测量值,但希望能够将每个 X2 条件用作测试类别。尽管每个人都可以属于 >1 X2 类别,但出于每个 t 检验的目的,个人要么满足条件,要么不满足条件 - 例如如果我比较 X2=30 与 X2=NOT-30,我希望个人 2 属于 30 类别而不是 NOT-30 类别

标签: r reshape


【解决方案1】:

这是一种选择:

library(data.table)
dt = data.table(your_df)

# get number of columns first (6 here)
max.N = max(dt[, .N*ncol(.SD), by = list(ID, X1)]$V1)

# now construct the result by filling in appropriate # of NA's
dt[, as.list(c(t(.SD), rep(NA, max.N - .N*ncol(.SD)))), by = list(ID, X1)]
#   ID  X1 V1     V2 V3    V4 V5    V6
#1:  1 1.4  2    two NA    NA NA    NA
#2:  2 7.6 30 thirty 50 fifty 40 forty
#3:  3 5.6 40  forty 50 fifty NA    NA
#4:  4 3.5 NA     NA NA    NA NA    NA
#5:  5  NA  2    two NA    NA NA    NA

【讨论】:

    【解决方案2】:

    从 1.9.6 版开始(在 CRAN 2015-09-19 上),data.tabledcast() 函数可以同时转换多个 value.var 列。

    dcast(DT, ID + X1 ~ rowid(ID), value.var = c("X2", "X3"))
    
       ID  X1 X2_1 X2_2 X2_3   X3_1  X3_2  X3_3
    1:  1 1.4    2   NA   NA    two    NA    NA
    2:  2 7.6   30   50   40 thirty fifty forty
    3:  3 5.6   40   50   NA  forty fifty    NA
    4:  4 3.5   NA   NA   NA     NA    NA    NA
    5:  5  NA    2   NA   NA    two    NA    NA
    

    数据

    library(data.table)
    DT <- fread(
    "ID  X1    X2    X3
      1   1.4   2     two
      2   7.6   30    thirty
      2   7.6   50    fifty
      2   7.6   40    forty
      3   5.6   40    forty
      3   5.6   50    fifty
      4   3.5   NA    NA
      5   NA    2     two"
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      相关资源
      最近更新 更多