【问题标题】:Reshape horizontal to to long format using pivot_longer使用 pivot_longer 将水平格式改造成长格式
【发布时间】:2020-08-28 13:24:54
【问题描述】:

我正在尝试使用之前提供的相同代码 link 将我的数据重塑为长格式而不是宽格式,但是即使经过多次尝试修改 names_pattern = "(.*)_(pre|post.*)", 也无法正常工作

我的数据样本是

data1<-read.table(text="
Serial_ID   pre_EDV pre_ESV pre_LVEF    post_EDV    post_ESV    post_LVEF
1   76.2    32.9    56.8    86.3    36.6    57.6
2   65.4    35.9    45.1    60.1    26.1    56.7
3   64.4    35.1    45.5    72.5    41.1    43.3
4   50      13.9    72.1    46.4    18.4    60.4
5   89.6    32      64.3    70.9    19.3    72.8
6   62      20.6    66.7    55.9    17.8    68.2
7   91.2    37.7    58.6    61.9    23.8    61.6
8   62      24      61.3    69.3    34.9    49.6
9   104.1   22.7    78.8    38.6    11.5    70.1
10  90.6    31.2    65.6    48      16.1    66.4", sep="", header=T)

我想将我的数据重塑为

  1. 将相同的列标题放在彼此下方,例如下方的 post_EDV pre_EDV
  2. 创建新列 Pre vs. post
  3. 修复列标题(将“pre_”和“post_”删除为仅“EDV”(如下面的屏幕截图所示))。

这是使用的代码:

library(dplyr);library(tidyr);library(stringr)
out <- data %>% pivot_longer(cols = -Serial_ID, 
           names_to = c(".value", "prevspost"), 
           names_pattern =  "(.*)_(pre|post.*)",
           names_sep="_") #%>% as.data.frame

我也尝试了names_prefix = c("pre_","post_") 而不是names_pattern = "(.*)_(pre|post.*)",,但它不起作用。

任何建议将不胜感激。

【问题讨论】:

  • 请提供一个可重现的问题,方法是添加一个最小数据作为对象,或者作为数据框,例如 data &lt;- data.frame(...) 其中 ... 是变量和值或 dput(head(data, n = 20))

标签: r pivot reshape tidyr


【解决方案1】:

编辑我推荐使用@Dave2e 的superior approach

您的尝试失败的原因是模式必须按顺序匹配。你可以试试这个:

library(tidyr)
library(dplyr) 
data1 %>% pivot_longer(cols = -Serial_ID, 
           names_to = c("prevspost",".value"), 
           names_pattern =  "(pre|post)_(\\w+)") %>%
   dplyr::arrange(desc(prevspost),Serial_ID)
# A tibble: 20 x 5
   Serial_ID prevspost   EDV   ESV  LVEF
       <int> <chr>       <dbl> <dbl> <dbl>
 1         1 pre          76.2  32.9  56.8
 2         2 pre          65.4  35.9  45.1
 3         3 pre          64.4  35.1  45.5
 4         4 pre          50    13.9  72.1
 5         5 pre          89.6  32    64.3
 6         6 pre          62    20.6  66.7
 7         7 pre          91.2  37.7  58.6
 8         8 pre          62    24    61.3
 9         9 pre         104.   22.7  78.8
10        10 pre          90.6  31.2  65.6
11         1 post         86.3  36.6  57.6
12         2 post         60.1  26.1  56.7
13         3 post         72.5  41.1  43.3
14         4 post         46.4  18.4  60.4
15         5 post         70.9  19.3  72.8
16         6 post         55.9  17.8  68.2
17         7 post         61.9  23.8  61.6
18         8 post         69.3  34.9  49.6
19         9 post         38.6  11.5  70.1
20        10 post         48    16.1  66.4

【讨论】:

    【解决方案2】:

    试试这个:

    library(dplyr);library(tidyr);library(stringr)
    out <- data1 %>% pivot_longer(-Serial_ID,
                                 names_to = c("measurement", "names"),
                                 values_to = "values",
                                 names_sep = "_")
    out
    # # A tibble: 60 x 4
    # Serial_ID measurement names values
    # <int> <chr>       <chr>  <dbl>
    # 1         1 pre         EDV     76.2
    # 2         1 pre         ESV     32.9
    # 3         1 pre         LVEF    56.8
    # 4         1 post        EDV     86.3
    # 5         1 post        ESV     36.6
    # 6         1 post        LVEF    57.6
    # 7         2 pre         EDV     65.4
    # 8         2 pre         ESV     35.9
    # 9         2 pre         LVEF    45.1
    # 10         2 post        EDV     60.1
    # # ... with 50 more rows
    

    您的代码片段将对象“data”而不是“data1”传递到产生错误的管道中:

    “错误:没有注册 tidyselect 变量”。

    【讨论】:

      【解决方案3】:

      您最初的方法非常接近,需要进行一些简化。仅使用“names_sep”或“names_pattern”

      library(tidyr)
      library(dplyr)
      
      data1 %>% pivot_longer(cols = -Serial_ID, 
                            names_to = c("Pre vs. post", '.value'), 
                            names_sep="_")
      
      # A tibble: 20 x 5
      Serial_ID `Pre vs. post`   EDV   ESV  LVEF
      <int> <chr>     <dbl> <dbl> <dbl>
      1         1 pre        76.2  32.9  56.8
      2         1 post       86.3  36.6  57.6
      3         2 pre        65.4  35.9  45.1
      4         2 post       60.1  26.1  56.7
      5         3 pre        64.4  35.1  45.5
      6         3 post       72.5  41.1  43.3
      7         4 pre        50    13.9  72.1
      8         4 post       46.4  18.4  60.4
      9         5 pre        89.6  32    64.3
      10         5 post       70.9  19.3  72.8
      11         6 pre        62    20.6  66.7
      12         6 post       55.9  17.8  68.2
      13         7 pre        91.2  37.7  58.6
      14         7 post       61.9  23.8  61.6
      15         8 pre        62    24    61.3
      16         8 post       69.3  34.9  49.6
      17         9 pre       104.   22.7  78.8
      18         9 post       38.6  11.5  70.1
      19        10 pre        90.6  31.2  65.6
      20        10 post       48    16.1  66.4
      

      【讨论】:

        猜你喜欢
        • 2021-08-01
        • 1970-01-01
        相关资源
        最近更新 更多