объединение столбцов из нескольких data.frames с циклом - PullRequest
1 голос
/ 16 сентября 2011

У меня есть 600 файлов .txt с разделителями табуляции, которые выглядят следующим образом:

                       barcode gene.symbol    value
1 TCGA-61-2610-02A-01R-1141-07      15E1.2 -0.78175
2 TCGA-61-2610-02A-01R-1141-07      2'-PDE  -1.0155
3 TCGA-61-2610-02A-01R-1141-07         7A5    0.029
4 TCGA-61-2610-02A-01R-1141-07        A1BG  0.96575
5 TCGA-61-2610-02A-01R-1141-07       A2BP1   -0.301
6 TCGA-61-2610-02A-01R-1141-07         A2M -2.21575

Я хочу собрать все 600 файлов в один фрейм данных так, чтобы gene.symbol был именами строк изначения будут объединены с первыми 12 символами штрих-кода, являющимися именем столбца.Поиск через SO, я думаю, что у меня есть цикл, который делает это с одной оговоркой.Вот что у меня есть (я все еще изучаю R, поэтому код может выглядеть очень грубым):

n = 600
df <- read.delim(file=paste("agilent1.txt")
df.tmp <- data.frame()
colnames(df) = c("barcode", "gene.symbol", levels(df$barcode))
df = df[2 :3]

как только у меня есть df со значениями первого файла, цикл начинает добавлять столбцы значений других файлов (файлы называются agilent1.txt, agilent2.txt и т. д.):

for (i in 2:n) {
  df.tmp <- read.delim(file=paste("agilent", i, ".txt", sep="")
  a <- as.character(levels(df.tmp$barcode))
  a <- substr(a, 1, 12)
  df <- cbind(df, a = df.tmp$value)
}

все работает НО в команде cbind, значение = df.tmp $ делает имя столбца a (что имеет смысл), но яхотите, чтобы значение a было именем столбца.

  gene.symbol                 TCGA-61-2614                   a                  a                  a        a
1      15E1.2                      0.80475            -0.47375           -0.26825           -0.13425 -0.78175
2      2'-PDE                   -0.1348125          -0.1565625            0.19475         -0.3819375  -1.0155
3         7A5                       2.2735              2.4405              0.902              1.248    0.029
4        A1BG            0.817166666666667 -0.0471666666666667            -0.1005 -0.283333333333333  0.96575
5       A2BP1           -0.811333333333333   -1.02566666666667 -0.494833333333333             -0.948   -0.301
6         A2M                       -0.719            -1.00575           -1.07275              0.517 -2.21575

Это звучит так просто в моей голове, но я не могу найти ответ.Любая помощь будет принята с благодарностью.

Приветствия,

Ахмет

Ответы [ 3 ]

4 голосов
/ 16 сентября 2011

Вам не нужно использовать явный цикл, если вы используете пакет reshape.Вот два лайнера, которые будут делать именно то, что вы ищете (если я правильно понимаю)

require(plyr); require(reshape);
files = paste('agilent', 1:600, '.txt', sep = "") # create list of files
dfs   = ldply(files, read.delim)                  # read files into data frame
cast(dfs, gene ~ barcode)                         # reshape to required format
3 голосов
/ 16 сентября 2011

Я предлагаю вам прочитать 600 файлов данных и поставить вместе:

myfiles <- list.files()
mydat <- c()
for(i in 1:length(myfiles)) {
    temp <- read.table(myfiles[i], header=T)
    mydat <- rbind(mydat, temp)
}

library(reshape2)
newdat <- cast(mydat, gene.symbol ~ barcode, value=value)

Если вы хотите, чтобы имена имен содержали только 12 символов, вы можете следовать ответу joran

2 голосов
/ 16 сентября 2011

Вы всегда можете просто установить имя столбца в отдельном шаге в конце цикла:

df <- cbind(df, a = df.tmp$value)
colnames(df)[i+1] <- a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...