2017-05-09 87 views
1

_a我正在尝试转换数据集。我想实现的是,如果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) 

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

+0

也许'库(data.table); dcast(setDT(DAT),型+ ROWID(类型,强度)〜 paste0(“intensity_”,intensity),value.var = c('damage_a','damage_b','damage_c'))' – akrun

+0

是的,但为什么在你的代码中有一个'type_f'变量?你能稍微解释一下这些命令的作用吗? – Danka

+0

我发表了评论作为一些解释的解决方案 – akrun

回答

1

我们可以使用dcastdata.table可以采取多种value.var列。由于每组有多个观测值,我们可以使用rowid函数通过公式中的'type'和'intensity'创建一个序列变量。这将导致一个新的列 '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][] 
0

查看tidyr中的聚集和传播函数,例如,

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