【问题标题】:from long data table to wide data table从长数据表到宽数据表
【发布时间】:2017-10-07 05:22:13
【问题描述】:

_a我正在尝试转换数据集。我想要实现的是,如果Intensitat = 1 - R 创建一个新列 - Intensity 1a - 并写入damage_a 的值。如果Intensitat = 2 - R 创建另一个新列 - 强度 2a - 并写入 damage_a 的值。最后,如果 Intensitat = 3,则 R 执行新列 - Intensity 3a - 并写入 damage_a 的值。 (它总是写入与强度指示器对应的同一行的damage_x 的值)。

然后我将运行相同的过程:从指标变量创建 3 列 - 每列用于指标值,并且在每列中使用 damage_b 的值。

最后还是一样,但使用 damage_c 的值。

type <- sample(seq(from = 1, to = 5, by = 1), size = 50, replace = TRUE)
type

intensity <- sample(seq(from = 1, to = 3, by = 1), size = 50, replace = TRUE)
intensity

damage_a <- sample(seq(from = 1, to = 50, by = 1), size = 50, replace = TRUE)
damage_b <- sample(seq(from = 1, to = 200, by = 1), size = 50, replace = TRUE)
damage_c <- sample(seq(from = 1, to = 500, by = 1), size = 50, replace = TRUE)

dat <- data.frame(type, intensity, damage_a, damage_b, damage_c)

# want to  evaluate if the difference in mean  between different damages 
  dat1 <- subset(dat, select = c(type, intensity, damage_a))
  dat2 <- subset(dat, select = c(type, intensity, damage_b))
  dat3 <- subset(dat, select = c(type, intensity, damage_c))

这对你来说似乎是一项非常容易的任务,但我已经坚持了两天了。我尝试过应用 tidyr 函数、ifelse 命令等,但从未获得我需要的东西。任何 cmets/想法都非常受欢迎。谢谢。

编辑

如果表格有这个方便的小功能,我设法改变了格式。

df.out <- unstack(dat, damage_a ~ intensity)

现在的问题是我得到的列表长度不同。如何将这些列表组合到一个数据框中?

【问题讨论】:

  • 或许library(data.table);dcast(setDT(dat), type + rowid(type, intensity) ~ paste0("intensity_", intensity), value.var = c('damage_a', 'damage_b', 'damage_c'))
  • 是的类似的东西,但为什么你的代码中有一个type_f 变量?你能解释一下这些命令的作用吗?
  • 我将评论作为解决方案发布了一些解释

标签: r if-statement data-manipulation tidyr


【解决方案1】:

我们可以使用来自data.tabledcast,它可以采用多个value.var 列。由于每组有多个观察值,我们可以使用rowid 函数在公式中按“类型”和“强度”创建序列变量。这将产生一个新列“type_1”,但可以稍后将其分配给NULL

library(data.table)
dcast(setDT(dat), type + rowid(type, intensity) ~ paste0("intensity_", 
  intensity), value.var = c('damage_a', 'damage_b', 'damage_c'))[, type_1 := NULL][]

【讨论】:

    【解决方案2】:

    查看 tidyr 中的收集和传播功能,例如

    dat <- tidyr::spread(dat, damage, value, -intensity, -type)   
    tidyr::spread(dat, damage, value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      • 2018-04-19
      • 2016-09-16
      相关资源
      最近更新 更多