从长数据表到宽数据表

时间:2017-05-09 03:37:45

标签: r if-statement data-manipulation tidyr

_我正在尝试转换数据集。我想要实现的是,如果Intensitat = 1 - R创建一个新列 - 强度1a - 并写入damage_a的值。如果Intensitat = 2 - R创建另一个新列 - 强度2a - 并写入damage_a的值。最后,如果Intensitat = 3,则R执行新列 - 强度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命令等,但从未获得我需要的东西。任何意见/想法都非常适合。谢谢。

修改

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

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

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

2 个答案:

答案 0 :(得分:1)

我们可以使用dcast中的data.tablevalue.var可以使用多个rowid列。由于每组有多个观察值,我们可以使用NULL函数通过&#39; type&#39;来创建序列变量。和强度&#39;在公式。这将生成一个新列&#39; type_1&#39;,但可以稍后将其分配给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][]

DependentUpon

答案 1 :(得分:0)

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

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