【问题标题】:r transform dataset from long to wider 将数据集从长转换为宽
【发布时间】:2016-07-29 03:27:52
【问题描述】:

我正在处理如下所示的长格式数据集。

  id      Name                 FluidTotal
  60718   Rocuronium           11.069175
  07860   Rocuronium           5.967500
  90389   Rocuronium           200.000000
  01536   Rocuronium           78.311333 
  01536   Rocuronium           51.415600 
  28047   Rocuronium           72.944444
  28047   Acid                 1
  28047   Acid                 1
  28047   Acid                 1
  28047   Acid                 1
  92323   Acid                 1
  92323   Void                 100
  01536   Void                 25
  60718   Void                 70
  60718   Void                 40  

我正在尝试将其转换为如下所示的宽格式

   Id      Rocuronium   Acid    Void
   60718   11.069175    -       110 
   07860   5.967500     -       -                                         
   90389   200.000000   -       -
   01536   129.72693    -       25
   28047   72.944444    4       -
   92323   -            1       100 

第一行是 60718 11.069175 - 110Void 的单元格值是 110 因为长格式的 id 60718 的最后两行是 7040 所以当它们转换为宽格式这两个值相加。

类似地,宽格式 id 01536Rocuronium 的值是 129.72693,因为此 id 01536 的长格式中的第 4 行和第 5 行是 78.31133351.415600

感谢您在完成此转换方面的任何帮助,在此先感谢..

【问题讨论】:

  • 与此处基本相同 - stackoverflow.com/questions/35424064/… - 只需将 min 替换为 sum - reshape(aggregate(FluidTotal ~ ., data=dat, FUN=sum), idvar="id", timevar="Name", direction="wide")
  • 或者,你可以使用tidyr包的spread函数。
  • reshape(aggregate( ....)) 似乎是新 R 用户一次成功和后来失败的处方。大多数有经验的 R 用户仍然无法使用 reshape
  • @42- 我真的不明白reshape 的普遍问题。无论如何,tapply 也是一个很好的解决方案,但它也将id 列丢失为row.name,这可能也会让初学者感到悲痛。
  • 也许您是唯一一个可以阅读reshape 帮助页面并找出哪些参数用于宽到长转换以及哪些参数用于长到宽的转换。我通常在第四次或第五次失败后放弃。

标签: r reshape melt


【解决方案1】:

基础函数tapply 函数让您可以在交叉分类的类别中进行操作:

with( dat, tapply( FluidTotal, list(id,Name), sum))

      Acid Rocuronium Void
1536    NA  129.72693   25
7860    NA    5.96750   NA
28047    4   72.94444   NA
60718   NA   11.06917  110
90389   NA  200.00000   NA
92323    1         NA  100

在描述转换时,折叠单个行的行为与从长到宽不同。应该注意的是,这会重新调整 R 矩阵对象,如果它需要采用数据框的形式,您可以使用 data.frame 来强制它。

【讨论】:

  • 不知道你有没有看到。不想在不承认的情况下默默删除。我将删除,因为它与主题无关。谢谢。
  • @42- 、latemail 和 Gopala,太简洁了。我也会测试其他解决方案
【解决方案2】:

我们可以使用xtabs(另一个base R函数)。默认情况下,xtabs 聚合 sum

xtabs(FluidTotal~., df1)
#         Name
#id          Acid Rocuronium      Void
# 1536    0.00000  129.72693  25.00000
# 7860    0.00000    5.96750   0.00000
# 28047   4.00000   72.94444   0.00000
# 60718   0.00000   11.06917 110.00000
# 90389   0.00000  200.00000   0.00000
# 92323   1.00000    0.00000 100.00000

【讨论】:

  • 默认?这确实是xtabs 的唯一选择。真的是else if (NCOL(y) == 1L) { tapply(y, by, sum)}
  • 是的,这是唯一的选择,
猜你喜欢
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-25
  • 2020-09-18
  • 1970-01-01
相关资源
最近更新 更多