R: транспонирование копий разных измерений, хранящихся в строках, в один столбец - PullRequest
0 голосов
/ 01 ноября 2018

Мне очень жаль, если название вводит в заблуждение, так как я не знаю, как это правильно объяснить (не знаю, какой будет терминология).

У меня есть некоторые данные, которые в основном выглядят так:

a<-c('AA01','AA02','AB01')
b<-c('AA','AA','AB')
c<-c('Y','N','N')
d<-c(1,2,3)
e<-c(4,5,6)
f<-c(7,8,9)
g<-c(11,22,33)
h<-c(44,55,66)
i<-c(77,88,99)
cols<-c("SampID","Characteristic1","Characteristic2","Mes1Rep1","Mes1Rep2","Mes1Rep3","Mes2Rep1","Mes2Rep2","Mes2Rep3")


df<-data.frame(a,b,c,d,e,f,g,h,i)
colnames(df)<-cols
df

  SampID Characteristic1 Characteristic2 Mes1Rep1 Mes1Rep2 Mes1Rep3 Mes2Rep1 Mes2Rep2 Mes2Rep3
1   AA01              AA               Y        1        4        7       11       44       77
2   AA02              AA               N        2        5        8       22       55       88
3   AB01              AB               N        3        6        9       33       66       99

В этом примере Mes1Rep1 относится к первой копии типа измерения, Mes2Rep2 ко второй копии этого измерения и т. Д. Я хотел бы разместить реплики в столбцах вместо этого. Нечто подобное:

  SampID Characteristic1 Characteristic2 Replicates Measurement1 Measurement2
1   AA01              AA               Y       Rep1            1           11
2   AA01              AA               Y       Rep2            4           44
3   AA01              AA               Y       Rep3            7           77
4   AA02              AA               N       Rep1            2           22
5   AA02              AA               N       Rep2            5           55
6   AA02              AA               N       Rep3            8           88
7   AB01              AB               N       Rep1            3           33
8   AB01              AB               N       Rep2            6           66
9   AB01              AB               N       Rep3            9           99

Как бы я поступил так в R? Я думаю, что я могу просто транспонировать сами строки, но есть ли способ также автоматически скопировать избыточные значения (например, «SampID» в этом примере)?

Или нет другого выбора, кроме как сделать это вручную?

Спасибо, что нашли время, чтобы прочитать это, и за то, что предложили свою помощь и / или руководство!

1 Ответ

0 голосов
/ 01 ноября 2018

Мы можем использовать melt из data.table, что может занять несколько measure patterns

library(data.table)
melt(setDT(df), measure = patterns("Mes1", "Mes2"), 
   variable.name = "Replicates", 
    value.name = c("Measurement1", "Measurement2"))[
      order(SampID)][, Replicates := paste0("Rep", Replicates)][]
#   SampID Characteristic1 Characteristic2 Replicates Measurement1 Measurement2
#1:   AA01              AA               Y       Rep1            1           11
#2:   AA01              AA               Y       Rep2            4           44
#3:   AA01              AA               Y       Rep3            7           77
#4:   AA02              AA               N       Rep1            2           22
#5:   AA02              AA               N       Rep2            5           55
#6:   AA02              AA               N       Rep3            8           88
#7:   AB01              AB               N       Rep1            3           33
#8:   AB01              AB               N       Rep2            6           66
#9:   AB01              AB               N       Rep3            9           99

Или используйте reshape из base R

reshape(df, idvar = c("SampID", "Characteristic1", "Characteristic2"), 
       varying = list(4:6, 7:9), direction = "long")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...