![](/img/trans.png)
[英]How to use R to reshape multiple rows to separate columns - long to wide?
[英]How to reshape data to long format by combining multiple columns and repeating rows?
我有以下示例数据,我打算将其转换为长格式。
dat <- data.frame(
subject = rep(paste("subject", 1:10), each = 4),
prac1 = round(rnorm(40, 0.25, 0.03), 3),
prac2 = round(rnorm(40, 0.25, 0.03), 3),
prac3 = round(rnorm(40, 0.25, 0.03), 3),
prac1_vs_crit1 = round(rnorm(40, 0.01, 0.005), 3),
prac2_vs_crit1 = round(rnorm(40, 0.01, 0.005), 3),
prac3_vs_crit1 = round(rnorm(40, 0.01, 0.005), 3),
prac1_vs_crit2 = round(rnorm(40, 0.01, 0.005), 3),
prac2_vs_crit2 = round(rnorm(40, 0.01, 0.005), 3),
prac3_vs_crit2 = round(rnorm(40, 0.01, 0.005), 3)
)
第 2-4 列是实际估计,第 5-10 列是实际( prac1
、 prac2
、 prac3
)和两个不同标准( crit1
/ crit2
)之间的差异。 每个主题有四行代表四个不同的试验。
subject prac1 prac2 prac3 prac1_vs_crit1 prac2_vs_crit1 prac3_vs_crit1
1 subject 1 0.261 0.245 0.257 0.011 0.008 0.008
2 subject 1 0.196 0.277 0.269 0.012 0.002 0.019
3 subject 1 0.235 0.249 0.189 0.010 0.006 0.010
4 subject 1 0.217 0.186 0.261 0.007 0.003 0.015
5 subject 2 0.269 0.225 0.218 0.013 0.009 0.017
6 subject 2 0.254 0.245 0.304 0.016 0.008 0.006
prac1_vs_crit2 prac2_vs_crit2 prac3_vs_crit2
1 0.013 0.008 0.016
2 0.008 0.010 0.007
3 0.002 0.008 0.006
4 0.005 0.012 0.013
5 0.009 0.011 0.003
6 0.011 0.012 0.026
我想将我的数据转换为长格式,因此它看起来像这样:
subject comparison difference prac_value
1 subject 1 prac1_vs_crit1 0.011 0.261
2 subject 1 prac2_vs_crit1 0.008 0.245
3 subject 1 prac3_vs_crit1 0.008 0.257
4 subject 1 prac1_vs_crit2 0.013 0.261
5 subject 1 prac2_vs_crit2 0.008 0.245
6 subject 1 prac3_vs_crit2 0.016 0.257
每个受试者有 24 行(每次试验 6 行),其中prac_value
表示与原始格式中以第一个分隔符(“_”)命名的列一致的值。 例如,对于subject 1
和prac1_vs_crit1
, prac_value
应该是 0.261 因为prac1
在原始格式中有这个值。
我遇到的问题是如何解决这个问题,特别是因为它涉及到为prac_value
列实现所需的 output。 将不胜感激任何帮助!
您可以通过首先以一致的方式重命名您的列和两个pivot_longer
来实现您想要的结果,如下所示:
set.seed(123)
library(tidyr)
library(dplyr, quietly = TRUE, warn.conflicts = FALSE)
dat_long <- dat |>
rename_with(.fn = ~ paste0(.x, "_value"), matches("^prac\\d+$")) |>
rename_with(.fn = ~ gsub("_vs", "", .x)) |>
pivot_longer(-subject, names_to = c("prac", ".value"), names_sep = "_") |>
pivot_longer(c(crit1, crit2), names_to = "crit", values_to = "difference") |>
unite(comparison, prac, crit, sep = "_vs_") |>
rename(prac_value = value)
head(dat_long)
#> # A tibble: 6 × 4
#> subject comparison prac_value difference
#> <chr> <chr> <dbl> <dbl>
#> 1 subject 1 prac1_vs_crit1 0.233 0.011
#> 2 subject 1 prac1_vs_crit2 0.233 0.006
#> 3 subject 1 prac2_vs_crit1 0.229 0.015
#> 4 subject 1 prac2_vs_crit2 0.229 0.002
#> 5 subject 1 prac3_vs_crit1 0.25 0.021
#> 6 subject 1 prac3_vs_crit2 0.25 0.011
count(dat_long, subject)
#> # A tibble: 10 × 2
#> subject n
#> <chr> <int>
#> 1 subject 1 24
#> 2 subject 10 24
#> 3 subject 2 24
#> 4 subject 3 24
#> 5 subject 4 24
#> 6 subject 5 24
#> 7 subject 6 24
#> 8 subject 7 24
#> 9 subject 8 24
#> 10 subject 9 24
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.