我的问题实际上与生物信息学和遗传学有关,但我发现它对其他程序员来说也很有趣。
作为背景,我有突变列表,每个患者样本一个文件,这意味着我有大约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中生成这种输出文件的一些提示,这是我最熟悉的。任何示例脚本等都将受到高度赞赏!
感谢你的帮助!
答案 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,如果您真的想要使用上面使用的格式的数据而不是整齐的格式。