我们如何重组这些变量?

时间:2018-07-27 21:54:57

标签: r reshape

我有以下假设数据,其中仅显示3个ID:

 df<-read.table(text="id    A1  A2  A3  A4  A5  G1  G2  G3  G4  M1  M2  M3  M4
1   2   2   2   2   2   2   3   1   0   12  19  15  12
 2  1   3   2   10  10  0   1   3   4   11  12  13  11
 3  2   4   1   0   0   1   0   4   4   19  7   6   5
 ", h=T)

我想得到下表:

id  A   ValueA  G   ValueG  M   ValueG
1   A1      G1      M1  
1   A2      G2      M2  
1                       
1                       
1                       
2                       
2                       
2                       
2                       
2                       
3                       
3                       
3                       
3                       
3                       

我在melt()中尝试过reshape 2,但没有得到。
是否可以通过这种方式重组此类数据?

2 个答案:

答案 0 :(得分:0)

library(data.table)

melt(setDT(df),1,patterns("^A","^G","^M"),"time",paste0("Value",c("A","G","M")))
    id time ValueA ValueG ValueM
 1:  1    1      2      2     12
 2:  2    1      1      0     11
 3:  3    1      2      1     19
 4:  1    2      2      3     19
 5:  2    2      3      1     12
 6:  3    2      4      0      7
 7:  1    3      2      1     15
 8:  2    3      2      3     13
 9:  3    3      1      4      6
10:  1    4      2      0     12
11:  2    4     10      4     11
12:  3    4      0      4      5
13:  1    5      2     NA     NA
14:  2    5     10     NA     NA
15:  3    5      0     NA     NA

您可以继续订购:

 melt(setDT(df),1,patterns("^A","^G","^M"),"time",paste0("Value",c("A","G","M")))[order(id)]
    id time ValueA ValueG ValueM
 1:  1    1      2      2     12
 2:  1    2      2      3     19
 3:  1    3      2      1     15
 4:  1    4      2      0     12
 5:  1    5      2     NA     NA
 6:  2    1      1      0     11
 7:  2    2      3      1     12
 8:  2    3      2      3     13
 9:  2    4     10      4     11
10:  2    5     10     NA     NA
11:  3    1      2      1     19
12:  3    2      4      0      7
13:  3    3      1      4      6
14:  3    4      0      4      5
15:  3    5      0     NA     NA

答案 1 :(得分:0)

这是一个棘手的问题,需要按首字母对列进行分组。

因此,我们需要将字母和数字部分的列名分开。

library(data.table)
# reshape from wide to long form
long <- melt(setDT(df), "id", variable.name = "var")
# split column name
long[, var.letter := stringr::str_extract(var, "^[A-Z]")]
long[, var.digit := stringr::str_extract(var, "[1-9]$")]
# reshape from long to wide using TWO measure vars
vars <- c("var", "value")
result <- dcast(long, id + var.digit ~ var.letter, value.var = vars)[, -"var.digit"]
result
    id var_A var_G var_M value_A value_G value_M
 1:  1    A1    G1    M1       2       2      12
 2:  1    A2    G2    M2       2       3      19
 3:  1    A3    G3    M3       2       1      15
 4:  1    A4    G4    M4       2       0      12
 5:  1    A5  <NA>  <NA>       2      NA      NA
 6:  2    A1    G1    M1       1       0      11
 7:  2    A2    G2    M2       3       1      12
 8:  2    A3    G3    M3       2       3      13
 9:  2    A4    G4    M4      10       4      11
10:  2    A5  <NA>  <NA>      10      NA      NA
11:  3    A1    G1    M1       2       1      19
12:  3    A2    G2    M2       4       0       7
13:  3    A3    G3    M3       1       4       6
14:  3    A4    G4    M4       0       4       5
15:  3    A5  <NA>  <NA>       0      NA      NA

现在,我们快到了。仅需调整列顺序

# create vector of column names in proper order
cols <- CJ(c("A", "G", "M"), vars, sorted = FALSE)[, paste(V2, V1, sep = "_")]
# change column order by reference
setcolorder(result, c( "id", cols))
result
    id var_A value_A var_G value_G var_M value_M
 1:  1    A1       2    G1       2    M1      12
 2:  1    A2       2    G2       3    M2      19
 3:  1    A3       2    G3       1    M3      15
 4:  1    A4       2    G4       0    M4      12
 5:  1    A5       2  <NA>      NA  <NA>      NA
 6:  2    A1       1    G1       0    M1      11
 7:  2    A2       3    G2       1    M2      12
 8:  2    A3       2    G3       3    M3      13
 9:  2    A4      10    G4       4    M4      11
10:  2    A5      10  <NA>      NA  <NA>      NA
11:  3    A1       2    G1       1    M1      19
12:  3    A2       4    G2       0    M2       7
13:  3    A3       1    G3       4    M3       6
14:  3    A4       0    G4       4    M4       5
15:  3    A5       0  <NA>      NA  <NA>      NA