首页 > 解决方案 > 多变量 R 的从宽到长的问题

问题描述

我知道这个问题已经在 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

解决方案


这能给你想要的输出吗?

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

推荐阅读