我有以下假设数据,其中仅显示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
,但没有得到。
是否可以通过这种方式重组此类数据?
答案 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