从列表生成汇总表(R)

时间:2017-01-10 13:05:50

标签: r reshape2

我的问题实际上与生物信息学和遗传学有关,但我发现它对其他程序员来说也很有趣。

作为背景,我有突变列表,每个患者样本一个文件,这意味着我有大约200个单独的文件。我想结合这些列表,然后比较不同患者组之间的这些突变。

所有输入文件均采用以下列表格式;

#Variants in patient A:
Variant1 0.5
Variant2 0.7

#Variants in patient  B:
Variant2 0.3
Variant3 0.6

#Variants in patient  C:
Variant4 0.5

我的问题是所有文件都不包含相同的变量,因为变体可能是唯一的,只能在一个文件中显示。我想总结这些文件并生成以下输出文件;

           Patient A     Patient B      Patient C
Variant1   0.5           <NA>           <NA>
Variant2   0.7           0.3            <NA>
Variant3   <NA>          0.6            <NA>
Variant4   <NA>          <NA>           0.5

我要问的是如何在R中生成这种输出文件的一些提示,这是我最熟悉的。任何示例脚本等都将受到高度赞赏!

感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

library(purrr)
library(stringr)
library(tidyr)
file1 <- "#Variants in patient A:
Variant1 0.5
Variant2 0.7"
file2 <- "#Variants in patient  B:
Variant2 0.3
Variant3 0.6"
file3 <- "#Variants in patient  C:
Variant4 0.5"
files <- paste0("file", 1:3)
files %>% 
  map(~ {
    patient <- str_extract(readLines(con = textConnection(get(.x)), n = 1L), pattern = "patient\\h+\\w+")
    data <- read.table(file = textConnection(get(.x)), skip = 1L, stringsAsFactors = FALSE, col.names = c("variant", "value"))
    cbind(data, patient)
  }) %>% 
  do.call(what = "rbind") %>% 
  spread(key = patient, value = value)

答案 1 :(得分:-1)

假设您的示例数据是一个文件的一部分,请使用readLines读取文件,使用grep标识id行,然后循环显示这些数据。

text <- readLines("myfile.txt")

patients <- grep("#", text)

plyr::ldply(1:length(patients), function(i){print(i)
  start <- patients[i]
  end <- c(patients[-1], length(text) + 1)[i]
  x <- read.table("myfile.txt", skip = start, nrows = end - start - 1, comment.char = "", blank.lines.skip = FALSE)
  names(x) <- c("variant", "value")
  x$patient <- gsub("^.*patient\\s+(.*):$", "\\1", text[start])
  x
})

使用NA过滤掉行,然后使用tidyr :: spread,如果您真的想要使用上面使用的格式的数据而不是整齐的格式。