繁体   English   中英

如何通过组合多列和重复行将数据重塑为长格式?

[英]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 列是实际( prac1prac2prac3 )和两个不同标准( 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 1prac1_vs_crit1prac_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM