Управление файлом с разделителями табуляции для 5 основных значений и печать с ним значений соседних столбцов - PullRequest
1 голос
/ 21 июня 2019

У меня есть файл с разделителями табуляции abc.txt

contig  score   guide
1:100-101   7   AAA
1:100-101   6   BBB
1:100-101   5   CCC
1:100-101   4   DDD
1:100-101   3   EEE
1:100-101   2   FFF
1:100-101   1   GGG
1:100-101   90  HHH
1:100-101   111 III
1:100-101   1111    JJJ
1:200-203   503.5333333 KKK
1:200-203   570.7212121 LLL
1:200-203   637.9090909 MMM
1:200-203   705.0969697 NNN
1:200-203   772.2848485 OOO
1:200-203   839.4727273 PPP
1:200-203   906.6606061 QQQ
1:200-203   973.8484848 RRR
2:300-301   1041.036364 SSS
2:300-301   1108.224242 TTT
2:300-301   1175.412121 UUU
2:300-301   1242.6  VVV
2:300-301   1309.787879 ABC
2:300-301   1376.975758 CGA
2:300-301   1444.163636 ACD

Столбец 1-Contig имеет несколько повторяющихся значений, у столбца 2 - оценки, а в столбце 3 - направляющие буквы, соответствующие показателям столбца-2.Мне нужно выбрать первые 5 баллов для похожих значений в первом столбце (contig) и вывести там соответствующие значения столбца 3.

Вывод должен выглядеть следующим образом: первый столбец содержит уникальную запись 1-Contig, а следующий10 строк для первых 5 баллов и соответствующих руководящих букв столбца 3

    Score-1 Guide-1 Score-2 Guide-2 Score-3 Guide-3 Score-4 Guide-4 Score-5 Guide-5
1:100-101   1111    JJJ 111 III 90  HHH 7   AAA 6   BBB
1:200-203   973.8484848 RRR 906.6606061 QQQ 839.4727273 PPP 772.2848485 OOO 705.0969697 NNN
2:300-301   1444.163636 ACD 1376.975758 CGA 1309.787879 ABC 1242.6  VVV 1175.412121 UUU

Я использовал пакеты "dplyr" и "desctools", однако я работаю с некоторой ошибкой.

library(dplyr)
library(DescTools)
file <- "abc.txt"
x=read.table(file)
b <- Large(x, k=5, unique = FALSE, na.last=NA)

и получаю эту ошибку

Error in Large(x, k = 5, unique = FALSE, na.last = NA) : 
  Not compatible with requested type: [type=character; target=double].

Мне удалось сделать это в excel, используя формулы 'sumproduct, large, iferror и vllokup', однако для больших наборов данных я хочу извлечь файл, используя R.

Любая помощь будет высоко ценится

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Нет необходимости искать пакеты, которые решают эту проблему - в базе R есть все, что вам нужно.

Сначала нам нужно разобраться с групповой операцией, поэтому мы разбиваем фрейм данных в соответствии с переменной группы contig с помощью функции split().Мы получаем список фреймов данных.Чтобы применить наши операции к каждому из них, мы можем использовать lapply(), который применяет данную функцию ко всем элементам списка.Мы строим функцию, которая выбирает первые 5 строк предоставленного фрейма данных x, упорядоченного по score (по убыванию с -x$score).Мы присваиваем результат z.Следующая структура do.call(data.frame, split…) только преобразует результат в предполагаемую форму.

Остается только упаковать список во фрейм данных и задать имена столбцов.

ll <- lapply(split(abc, abc$contig), function(x) {
      z <- x[order(-x$score)[1:5], 2:3]
      do.call(data.frame, split(z, 1:5))
    })

ll         # we're almost there …

$`1:100-101`
  X1.score X1.guide X2.score X2.guide X3.score X3.guide X4.score X4.guide X5.score X5.guide
10     1111      JJJ      111      III       90      HHH        7      AAA        6      BBB

$`1:200-203`
   X1.score X1.guide X2.score X2.guide X3.score X3.guide X4.score X4.guide X5.score X5.guide
    18 973.8485      RRR 906.6606      QQQ 839.4727      PPP 772.2848      OOO  705.097      NNN

$`2:300-301`
   X1.score X1.guide X2.score X2.guide X3.score X3.guide X4.score X4.guide X5.score X5.guide
25 1444.164      ACD 1376.976      CGA 1309.788      ABC   1242.6      VVV 1175.412      UUU

# … only pack the list to a data frame and set the columnnames
d.frm <- (do.call(rbind, ll))
colnames(d.frm) <- c(paste("Guide", 1:5), paste("Score", 1:5))[as.vector(t(matrix(1:10, nrow=5)))]

d.frm

            Guide 1 Score 1   Guide 2 Score 2   Guide 3 Score 3   Guide 4 Score 4  Guide 5 Score 5
1:100-101 1111.0000     JJJ  111.0000     III   90.0000     HHH    7.0000     AAA    6.000     BBB
1:200-203  973.8485     RRR  906.6606     QQQ  839.4727     PPP  772.2848     OOO  705.097     NNN
2:300-301 1444.1636     ACD 1376.9758     CGA 1309.7879     ABC 1242.6000     VVV 1175.412     UUU
1 голос
/ 21 июня 2019

Проблема в том, что ожидается числовой вектор, а не весь фрейм данных.Это всего лишь предположение, так как у меня нет воспроизводимого примера, но вы можете сделать что-то вроде этого:

library(dplyr)
library(DescTools)
file <- "./abc.txt"
x=read.table(file)
colnames(x)<-c("contig","score","guide")
x<-x[-1,]

list <- split(x , f = x$contig )
columntitles<-c()
for (i in 1:5)
  columntitles<-c(columntitles,paste0("guide-",i),paste0("score-",i))
x = data.frame(matrix(NA, nrow = 1, ncol = 10)) 
colnames(x)<-columntitles

for (i in 1:3){
  singlerow<-c()
  partialdata<-list[[i]]
  partialdata<-partialdata%>% top_n(5, score)
  partialdata<-partialdata[Rev(order(partialdata$score)),]
  for (j in 1:5){
    singlerow<-c(singlerow,toString(partialdata$guide[j]),toString(partialdata$score[j]))

  }
  x<-rbind(x,singlerow)
}
x<-x[-1,]
...