【问题标题】:Wide to long problems with multiple variables R多变量 R 的从宽到长的问题
【发布时间】:2021-03-17 14:51:45
【问题描述】:

我知道这个问题已经在 stackoverflow 中被广泛讨论过,但我还是想不通。 我有一个如下数据集,其中包含两个变量 IC 和 T; 4个主体间因素(A、B、C、D)和两个主体内因素(1,2)。我想将此数据集转换为具有一列 ID 的长格式,一列用于规范它是哪个主题因子,一列用于内部变量,两列用于值变量 IC 和 T。

df <- read.table(header=TRUE, text="
ID IC_A_1 IC_A_2 IC_B_1 IC_B_2 IC_C_1 IC_C_2 IC_D_1 IC_D_2 T_A_1 T_A_2 T_B_1 T_B_2 T_C_1 T_C_2 T_D_1 T_D_2  
1 1 2 NA NA NA NA NA NA 2 5 NA NA NA NA NA NA
2 3 4 NA NA NA NA NA NA 5 5 NA NA NA NA NA NA
3 NA NA 3 4 NA NA NA NA NA NA 5 7 NA NA NA NA
4 NA NA 2 1 NA NA NA NA NA NA 5 5 NA NA NA NA
5 NA NA NA NA 3 3 NA NA NA NA NA NA 3 4 NA NA
6 NA NA NA NA 2 3 NA NA NA NA NA NA 3 4 NA NA
7 NA NA NA NA NA NA 4 5 NA NA NA NA NA NA 6 7
8 NA NA NA NA NA NA 4 7 NA NA NA NA NA NA 4 2
")

非常感谢大家!

【问题讨论】:

    标签: r


    【解决方案1】:

    这能给你想要的输出吗?

    out <- reshape(
      setNames(df, sub("_", ".", names(df))),
      direction = "long",
      idvar = "ID",
      varying = -1
    )
    

    这样

          ID time IC  T
    1.A_1  1  A_1  1  2
    2.A_1  2  A_1  3  5
    3.A_1  3  A_1 NA NA
    4.A_1  4  A_1 NA NA
    5.A_1  5  A_1 NA NA
    6.A_1  6  A_1 NA NA
    7.A_1  7  A_1 NA NA
    8.A_1  8  A_1 NA NA
    1.A_2  1  A_2  2  5
    2.A_2  2  A_2  4  5
    3.A_2  3  A_2 NA NA
    4.A_2  4  A_2 NA NA
    5.A_2  5  A_2 NA NA
    6.A_2  6  A_2 NA NA
    7.A_2  7  A_2 NA NA
    8.A_2  8  A_2 NA NA
    1.B_1  1  B_1 NA NA
    2.B_1  2  B_1 NA NA
    3.B_1  3  B_1  3  5
    4.B_1  4  B_1  2  5
    5.B_1  5  B_1 NA NA
    6.B_1  6  B_1 NA NA
    7.B_1  7  B_1 NA NA
    8.B_1  8  B_1 NA NA
    1.B_2  1  B_2 NA NA
    2.B_2  2  B_2 NA NA
    3.B_2  3  B_2  4  7
    4.B_2  4  B_2  1  5
    5.B_2  5  B_2 NA NA
    6.B_2  6  B_2 NA NA
    7.B_2  7  B_2 NA NA
    8.B_2  8  B_2 NA NA
    1.C_1  1  C_1 NA NA
    2.C_1  2  C_1 NA NA
    3.C_1  3  C_1 NA NA
    4.C_1  4  C_1 NA NA
    5.C_1  5  C_1  3  3
    6.C_1  6  C_1  2  3
    7.C_1  7  C_1 NA NA
    8.C_1  8  C_1 NA NA
    1.C_2  1  C_2 NA NA
    2.C_2  2  C_2 NA NA
    3.C_2  3  C_2 NA NA
    4.C_2  4  C_2 NA NA
    5.C_2  5  C_2  3  4
    6.C_2  6  C_2  3  4
    7.C_2  7  C_2 NA NA
    8.C_2  8  C_2 NA NA
    1.D_1  1  D_1 NA NA
    2.D_1  2  D_1 NA NA
    3.D_1  3  D_1 NA NA
    4.D_1  4  D_1 NA NA
    5.D_1  5  D_1 NA NA
    6.D_1  6  D_1 NA NA
    7.D_1  7  D_1  4  6
    8.D_1  8  D_1  4  4
    1.D_2  1  D_2 NA NA
    2.D_2  2  D_2 NA NA
    3.D_2  3  D_2 NA NA
    4.D_2  4  D_2 NA NA
    5.D_2  5  D_2 NA NA
    6.D_2  6  D_2 NA NA
    7.D_2  7  D_2  5  7
    8.D_2  8  D_2  7  2
    

    如果你想删除带有NAs的行,你可以试试

    > na.omit(out)
          ID time IC T
    1.A_1  1  A_1  1 2
    2.A_1  2  A_1  3 5
    1.A_2  1  A_2  2 5
    2.A_2  2  A_2  4 5
    3.B_1  3  B_1  3 5
    4.B_1  4  B_1  2 5
    3.B_2  3  B_2  4 7
    4.B_2  4  B_2  1 5
    5.C_1  5  C_1  3 3
    6.C_1  6  C_1  2 3
    5.C_2  5  C_2  3 4
    6.C_2  6  C_2  3 4
    7.D_1  7  D_1  4 6
    8.D_1  8  D_1  4 4
    7.D_2  7  D_2  5 7
    8.D_2  8  D_2  7 2
    

    【讨论】:

      【解决方案2】:

      这至少在某种程度上对您有帮助吗?

      library(tidyverse)
      df %>%
        pivot_longer(-ID) %>% 
        tidyr::separate(name, into = c("IC_T", "subject_factors", "id"))
      
      # A tibble: 128 x 5
            ID IC_T  subject_factors id    value
         <int> <chr> <chr>           <chr> <int>
       1     1 IC    A               1         1
       2     1 IC    A               2         2
       3     1 IC    B               1        NA
       4     1 IC    B               2        NA
       5     1 IC    C               1        NA
       6     1 IC    C               2        NA
       7     1 IC    D               1        NA
       8     1 IC    D               2        NA
       9     1 T     A               1         2
      10     1 T     A               2         5
      

      【讨论】:

        猜你喜欢
        • 2019-03-14
        • 2019-12-24
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 2018-05-05
        相关资源
        最近更新 更多