【问题标题】:Reshape long to wide efficiently with amount variable and several ID variables使用数量变量和几个 ID 变量有效地重塑长到宽
【发布时间】:2021-02-08 22:04:03
【问题描述】:

我的数据类似于下面第一张图表的更大版本。我想把它“解开”到第二张图表中,但我不能有效地做到这一点。在底部,我有我最近的尝试,其中 IDVars 基本上是下面的前三列。在我需要杀死它之前它运行了 15 分钟。

Name ID Trial Variable Amount
Name 1 1 1 FinalSalary 300.00
Name 1 1 1 FinalDCBalance 400.00
Name 1 1 2 FinalSalary 300.00
Name 1 1 2 FinalDCBalance 300.00
Name 2 2 1 FinalSalary 400.00
Name 2 2 1 FinalDCBalance 400.00
Name 2 2 2 FinalSalary 200.00
Name 2 2 2 FinalDCBalance 300.00
Name 3 3 1 FinalSalary 100.00
Name 3 3 2 FinalDCBalance 400.00
Name ID Trial FinalSalary FinalDCBalance
Name 1 1 1 300 400
Name 1 1 2 300 300
Name 2 2 1 400 400
Name 2 2 2 200 300
Name 3 3 1 100 400
Name 3 3 2 300 100
unmelt <- reshape(dataframe, idvar = IDVars, v.names = 'variable', direction = 'wide', timevar = 'Amount')

【问题讨论】:

  • 也许可以试试data.table::dcast
  • @Connor IDVars 是什么?此外,您的示例数据中没有包含Name 3Trial == 2 的行。你能澄清一下吗?请分享dput(head(your_data, 15))
  • @Markus IDVars本质上是c('Name','ID','Trial'),以上面为例。实际数据中有更多匹配的ID。你看到的是一个错字,我在上面的图表中更正了它。
  • @ConnorJoseph 你能试试reshape(df1, idvar = c("Name", "ID", "Trial"), timevar = "Variable", direction = "wide") 你的例子应该有2个NAs。

标签: r reshape2


【解决方案1】:

我们可以使用pivot_wider

library(tidyr)
pivot_wider(df1, names_from = 'Variable', values_from = 'Amount')

【讨论】:

    【解决方案2】:

    timevar= 应该是 "Variable",而不是 "Amount"。 idvar 列在侧面,timevar 列在顶部,其他所有内容(数量)作为值进入输出主体。 v.names = "Amount" 可以指定,但它会计算出来,因为那是剩下的唯一一列,所以我们省略了它。

    r <- reshape(dd, dir = "wide", idvar = c("Name", "ID", "Trial"), timevar = "Variable")
    names(r) <- sub("Amount.", "", names(r)) # optional
    

    给予:

    > r
         Name ID Trial FinalSalary FinalDCBalance
    1  Name 1  1     1         300            400
    3  Name 1  1     2         300            300
    5  Name 2  2     1         400            400
    7  Name 2  2     2         200            300
    9  Name 3  3     1         100             NA
    10 Name 3  3     2          NA            400
    

    注意

    可重现形式的输入:

    dd <- structure(list(Name = c("Name 1", "Name 1", "Name 1", "Name 1", 
    "Name 2", "Name 2", "Name 2", "Name 2", "Name 3", "Name 3"), 
        ID = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L), Trial = c(1L, 
        1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 2L), Variable = c("FinalSalary", 
        "FinalDCBalance", "FinalSalary", "FinalDCBalance", "FinalSalary", 
        "FinalDCBalance", "FinalSalary", "FinalDCBalance", "FinalSalary", 
        "FinalDCBalance"), Amount = c(300, 400, 300, 300, 400, 400, 
        200, 300, 100, 400)), class = "data.frame", row.names = c(NA, 
    -10L))
    

    【讨论】:

      猜你喜欢
      • 2018-02-17
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 2021-03-05
      • 1970-01-01
      相关资源
      最近更新 更多