从长数据 table 到宽数据 table
from long data table to wide data table
_a我正在尝试转换数据集。我想要实现的是,如果 Intensitat
= 1 - R 创建一个新列 - 强度 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))
这对你来说似乎是一件很容易的事,但我已经坚持了两天了。我尝试过 applyin tidyr 函数、ifelse 命令等,但从未获得我需要的东西。任何 comments/ideas 都非常适用。谢谢。
编辑:
如果 table 有了这个方便的小功能,我设法更改了格式。
df.out <- unstack(dat, damage_a ~ intensity)
现在的问题是我得到的列表长度不同。我如何将这些列表合并到一个数据框中?
查看 tidyr 中的 gather 和 spread 函数,例如
dat <- tidyr::spread(dat, damage, value, -intensity, -type)
tidyr::spread(dat, damage, value)
我们可以使用 data.table
中的 dcast
,它可以包含多个 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][]
_a我正在尝试转换数据集。我想要实现的是,如果 Intensitat
= 1 - R 创建一个新列 - 强度 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))
这对你来说似乎是一件很容易的事,但我已经坚持了两天了。我尝试过 applyin tidyr 函数、ifelse 命令等,但从未获得我需要的东西。任何 comments/ideas 都非常适用。谢谢。
编辑:
如果 table 有了这个方便的小功能,我设法更改了格式。
df.out <- unstack(dat, damage_a ~ intensity)
现在的问题是我得到的列表长度不同。我如何将这些列表合并到一个数据框中?
查看 tidyr 中的 gather 和 spread 函数,例如
dat <- tidyr::spread(dat, damage, value, -intensity, -type)
tidyr::spread(dat, damage, value)
我们可以使用 data.table
中的 dcast
,它可以包含多个 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][]