【问题标题】:dcast data.table with multiple value.var's of different classes具有不同类的多个 value.var 的 dcast data.table
【发布时间】:2021-11-16 21:28:20
【问题描述】:

我正在尝试将dcast 我的输入数据inDT 转换为预期的输出outDT

library(data.table)   

inDT <- data.table(
      int_value = c(2020L, 1L:10L, rep(NA_integer_, 20)),
      num_value = c(rep(NA_real_, 11), seq(0.1, 1, 0.1), rep(NA_real_, 10)),
  timestamp_value = c(rep(as.POSIXct(NA), 21), Sys.time() - 1:10),
  id = c(
    "int_id_1",
    rep("int_id_2", 10),
    rep("num_id", 10),
    rep("timestamp_id", 10)
  )
)

outDT <- data.table(
  int_id_1 = c(2020L, rep(NA_integer_, 9)),
  int_id_2 = 1L:10L,
  num_id = seq(0.1, 1, 0.1),
  timestamp_id = Sys.time() - 1:10
)

我用dcast.data.table尝试了几个不同的星座:

dcast.data.table(inDT, int_value + num_value + timestamp_value ~ id, value.var = c("int_value", "num_value", "timestamp_value"))
dcast.data.table(inDT, . ~ id, value.var = c("int_value", "num_value", "timestamp_value"))

但我似乎在这里遗漏了一些东西。

非常感谢任何帮助。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    一个不完美的方法:

    inDT[, rn := rowid(id)]
    Filter(function(z) !all(is.na(z)),
           dcast(inDT, rn ~ id, value.var = list("int_value", "num_value", "timestamp_value")))
    #        rn int_value_int_id_1 int_value_int_id_2 num_value_num_id timestamp_value_timestamp_id
    #     <int>              <int>              <int>            <num>                       <POSc>
    #  1:     1               2020                  1              0.1          2021-09-23 09:15:41
    #  2:     2                 NA                  2              0.2          2021-09-23 09:15:40
    #  3:     3                 NA                  3              0.3          2021-09-23 09:15:39
    #  4:     4                 NA                  4              0.4          2021-09-23 09:15:38
    #  5:     5                 NA                  5              0.5          2021-09-23 09:15:37
    #  6:     6                 NA                  6              0.6          2021-09-23 09:15:36
    #  7:     7                 NA                  7              0.7          2021-09-23 09:15:35
    #  8:     8                 NA                  8              0.8          2021-09-23 09:15:34
    #  9:     9                 NA                  9              0.9          2021-09-23 09:15:33
    # 10:    10                 NA                 10              1.0          2021-09-23 09:15:32
    

    注意:我必须添加rn,一个表示每个id 中行号的列,因为旋转操作需要将行关联在一起的前提。

    【讨论】:

    • 这太好了,谢谢!有什么具体原因可以称您的方法不完美吗?
    • 主要是因为它在Filter 输出所有-NA 列之前进行了更多的扩展。我不知道有没有更好的方法来做到这一点......也许tidyr::pivot_wider 可能会提供一种更清洁的方法。不过,除了命名之外,我认为它可能已经足够好了。
    • 既然你是新人...... 慢慢来,如果你对这解决了你的问题感到满意,请回来accept it。许多问题选择保持开放更长时间,希望有替代(更清洁!)的方法,所以请随时保持开放一段时间。但是在某个时候(今天、明天、下周)请记得回来关闭它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2018-10-08
    • 2020-05-11
    • 2016-10-04
    • 2019-03-19
    相关资源
    最近更新 更多