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