多变量宽到长问题R

多变量宽到长问题R,r,R,我知道这个问题在stackoverflow中已经被广泛讨论过了,但我仍然无法解决。 我有一个如下的数据集,有两个变量IC和T;4个受试因素之间(A、B、C、D)和两个受试因素内部(1,2)。我想将这个数据集转换成一个longformat,其中一个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

我知道这个问题在stackoverflow中已经被广泛讨论过了,但我仍然无法解决。 我有一个如下的数据集,有两个变量IC和T;4个受试因素之间(A、B、C、D)和两个受试因素内部(1,2)。我想将这个数据集转换成一个longformat,其中一个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
")

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

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
库(tidyverse)
df%>%
枢轴长度(-ID)%>%
tidyr::separate(名称,into=c(“IC\u T”、“subject\u factors”、“id”))
#一个tibble:128 x 5
ID IC_T主题_因子ID值
1集成电路A 1 1
2 1集成电路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 12
10 1 T A 2 5

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

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
库(tidyverse)
df%>%
枢轴长度(-ID)%>%
tidyr::separate(名称,into=c(“IC\u T”、“subject\u factors”、“id”))
#一个tibble:128 x 5
ID IC_T主题_因子ID值
1集成电路A 1 1
2 1集成电路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 12
10 1 T A 2 5

这能给您提供所需的输出吗

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

如果要删除带有
NA
s的行,可以尝试

> 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

这能给你期望的输出吗

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

如果要删除带有
NA
s的行,可以尝试

> 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