【问题标题】:Reshape wide to long, multiple columns and multiple time periods重塑宽到长,多列和多个时间段的问题
【发布时间】:2022-08-04 14:48:53
【问题描述】:

我试图从宽到长重塑数据,但我无法得到答案。结构如下:

id n_dep_1 n_dep_2 bleed_1 bleed_2 secretion_1 secretion_2 eva_1 eva_2
1 1 2 1 1 1 1 9 7
2 2 1 0 1 1 0 5 6
3 2 1 1 0 1 1 7 5

注意:我对每个关键变量 \"n_dep\"、\"bleed\"、\"secretion\" 和 \"eva\" 进行了 14 次测量。

我需要这样的东西:

id n_dep bleed secretion eva
1 1 1 1 9
1 2 1 1 7
2 2 0 1 5
2 1 1 0 6
3 2 1 1 7
3 1 0 1 5

我试过这个:

require(data.table)
melt(setDT(data_wide), id=\"id\",
     measure=patterns(\"n_dep_$\", \"eva_$\", \"bleed_$\",\"secretion_$\"), 
     value.name=c(\"n_dep\", \"eva\", \"bleed\",\"secretion\"))

我得到了这个错误:

do_patterns(measure.sub, names(data)) 中的错误: 未找到模式:[n_dep_$、eva_$、bleed_$、secrement_$]

我也尝试过重塑和聚集,但我无法让它发挥作用。

请帮忙。

    标签: r tidyr reshape gather


    【解决方案1】:

    它不是 data.table,但使用 tidyverse 你可以这样做:

    library(tidyverse)
    d |> 
      gather("var", "val", -id) |> 
      mutate(id2 = str_extract(var, "\\d$"), 
             var = str_remove(var, "_\\d$")) |> 
      spread(var, val)
    #> # A tibble: 6 × 6
    #>      id id2   bleed   eva n_dep secretion
    #>   <dbl> <chr> <dbl> <dbl> <dbl>     <dbl>
    #> 1     1 1         1     9     1         1
    #> 2     1 2         1     7     2         1
    #> 3     2 1         0     5     2         1
    #> 4     2 2         1     6     1         0
    #> 5     3 1         1     7     2         1
    #> 6     3 2         0     5     1         1
    

    reprex package (v2.0.1) 于 2022 年 3 月 28 日创建

    【讨论】:

      【解决方案2】:

      更简单的方法是从tidyr 调用pivot_longer

      tidyr::pivot_longer(data_wide, -id, names_pattern = '(^.*)_', names_to = ".value") 
      
      #> # A tibble: 6 x 5
      #>      id n_dep bleed secretion   eva
      #>   <int> <int> <int>     <int> <int>
      #> 1     1     1     1         1     9
      #> 2     1     2     1         1     7
      #> 3     2     2     0         1     5
      #> 4     2     1     1         0     6
      #> 5     3     2     1         1     7
      #> 6     3     1     0         1     5
      

      【讨论】:

        【解决方案3】:

        模式中的正则表达式与列名不匹配。

        您当前指定如下,例如“n_dep_$”可能期望匹配 n_dep_1、n_dep_2 等。正则表达式要求以下划线结尾且后面没有数字的列名,因为 $ 标记结束的输入。

        do_patterns 正在返回错误,因为列名中的正则表达式不匹配。

        请尝试:

        melt(setDT(data_wide), id="id",
             measure=patterns("^n_dep_\\d+$", "^eva_\\d+$", "^bleed_\\d+$","^secretion_\\d+$"), 
             value.name=c("n_dep", "eva", "bleed","secretion"))
        

        这 ^ 表示输入的开始,而 $ 表示输入的结束。所以在这里,^n_dep_\\d+$ 请求以“n_dep_”开头并以一位(或多位)数字结尾的列。

        【讨论】:

          猜你喜欢
          • 2019-11-22
          • 1970-01-01
          • 1970-01-01
          • 2018-06-05
          • 1970-01-01
          • 2019-12-24
          • 2015-10-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多