【问题标题】:R- format a data.frame into another 'combined' data.frame based on common values within a column dependent across different columnsR-根据跨不同列的列中的公共值将data.frame格式化为另一个“组合”data.frame
【发布时间】:2013-06-04 17:40:23
【问题描述】:

我从一个包含三列的数据框开始。 第 1 列包含指示 3 个不同时间段的 ID,其中某些人(第 2 列)的体重(第 3 列)以公斤为单位。

所有人员都被不定期地测量,这意味着,有些人在一个时间段内被多次测量或只测量一次,但不是在所有时间段内测量。

   id       person_name person_weight
    1          Carol         51
    1          Mike          76
    1          Mike          81
    1          Dave          66
    1          Carol         59
    2          James         78
    2          Simone        55
    2          Simone        49
    2          David         85
    3          Mike          93
    3          Dave          110
    3          Dave          98 

实际上,这里的整个事情只是一个简化的例子。如果这种数据收集没有意义,请不要打扰。

现在,我想计算一段时间内每个人的平均(平均)体重,然后 最终得到一个如下所示的组合数据框:

group_id    Carol   Mike    Dave    James   Simone  David
   1         55     78.5     66      NA       NA     NA
   2         NA      NA      NA      78       52     85
   3         NA      93      104     NA       NA     NA

我尝试了一些基本的 R 函数(table、a​​pply 等),但无法处理列之间的依赖关系。

提前感谢任何帮助,使我更接近第二个/“组合”数据框。

【问题讨论】:

  • 我认为一些词汇在这里会有所帮助。您的第一个数据集,其中每个测量 是一个单独的记录,称为long 格式数据。有两种对应的wide 格式:一种为每个组(您想要的)一行,另一种为每个人一行。长宽格式切换一般称为reshaping;我们将melt 宽数据转换为长数据,将cast 长数据转换为宽数据。这些是强大的概念,reshape2 是它们的一个很好的实现——让生活变得如此轻松。非常值得花时间学习。
  • “值得花时间学习”。 Joran 的解决方案批准了您的建议。

标签: r


【解决方案1】:

看起来很简单的dcast:

library(reshape2)
dcast(dat,id ~person_name,
      fun.aggregate = mean,
      value.var = "person_weight",fill = NA_real_)
  id Carol Dave David James Mike Simone
1  1    55   66    NA    NA 78.5     NA
2  2    NA   NA    85    78   NA     52
3  3    NA  104    NA    NA 93.0     NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多