Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从长数据表到宽数据表_R_If Statement_Data Manipulation_Tidyr - Fatal编程技术网

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][]