R 从长数据表到宽数据表
_我正在尝试转换数据集。我想要实现的是,如果R 从长数据表到宽数据表,r,if-statement,data-manipulation,tidyr,R,If Statement,Data Manipulation,Tidyr,_我正在尝试转换数据集。我想要实现的是,如果intensitytat=1-R创建一个新列-Intensity 1a-并写入damage\u a的值。如果intensitytat=2,R将创建另一个新列-Intensity 2a-并写入damage\u a。最后,如果IntensityTat=3,则R生成新的列-Intensity 3a-并写入损坏\u a的值。(它总是写入与强度指示器对应的同一行的损坏_x值) 然后我将运行相同的过程:从指标变量创建3列-每列对应一个指标值,并在每列中使用dama
intensitytat
=1-R创建一个新列-Intensity 1a-并写入damage\u a
的值。如果intensitytat
=2,R将创建另一个新列-Intensity 2a-并写入damage\u a
。最后,如果IntensityTat=3,则R生成新的列-Intensity 3a-并写入损坏\u a的值。(它总是写入与强度指示器对应的同一行的损坏_x值)
然后我将运行相同的过程:从指标变量创建3列-每列对应一个指标值,并在每列中使用damage\b
的值
最后,再次使用相同的值,但使用damage\u 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))
type查看tidyr中的聚集和扩散功能,例如
dat <- tidyr::spread(dat, damage, value, -intensity, -type)
tidyr::spread(dat, damage, value)
dat我们可以使用data.table
中的dcast
,它可以获取多个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][]
可能库(data.table);dcast(setDT(dat),type+rowid(type,intensity)~paste0(“intensity”,intensity),value.var=c('damage_a','damage_b','damage_c'))
是这样的,但为什么代码中有type_f
变量?你能解释一下comands是做什么的吗?我把这条评论作为一个解决方案贴了出来,并做了一些解释
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][]