如何通过提取特定行来创建变量?
How to make a variable by extracting specific line?
我有如下数据,基因名称(例如 ABCB9)中包含 SNP 名称(rs 编号或 c#_pos#)。在名为 c#_pos000000 的 SNP 中,# 的范围是 1 到 22(染色体编号)
ABCB9
rs11057374
rs7138100
c22_pos41422393
rs12309481
END
ABCC10
rs1214748
END
HDAC9
rs928578
rs10883039
END
HCN2
rs12428035
rs9561933
c2_pos102345
rs3848077
rs3099362
END
通过使用这些数据,我想使输出如下所示
rs11057374 ABCB9
rs7138100 ABCB9
c22_pos41422393 ABCB9
rs12309481 ABCB9
rs1214748 ABCC10
rs928578 HDAC9
rs10883039 HDAC9
rs12428035 HCN2
rs9561933 HCN2
c2_pos102345 HCN2
rs3848077 HCN2
rs3099362 HCN2
是否有空格不需要"END"
如何在R或linux中输出这个?
我们可以稍微改变一下。使用 readLines
读取文件并删除 leading/lagging 空格 (trimws
) 后,split
'lines1' 基于基于空白值创建的分组向量 (""
), 从 list
元素中删除 ""
或 "END"
字符串,然后设置 list
的 names
与每个的第一次观察list
元素 (sapply(lst1,
[, 1)
) 同时提取除第一个元素和 stack
之外的所有其他元素。
lines1 <- trimws(lines)
lst1 <- lapply(split(lines1, cumsum(lines1=="")),
function(x) x[!x %in% c("", "END")])
stack(setNames(lapply(lst1,`[`,-1), sapply(lst1, `[`,1)))
# values ind
#1 rs11057374 ABCB9
#2 rs7138100 ABCB9
#3 c22_pos41422393 ABCB9
#4 rs12309481 ABCB9
#5 rs1214748 ABCC10
#6 rs928578 HDAC9
#7 rs10883039 HDAC9
#8 rs12428035 HCN2
#9 rs9561933 HCN2
#10 c2_pos102345 HCN2
#11 rs3848077 HCN2
#12 rs3099362 HCN2
数据
lines <- readLines("yourdata.txt")
不要使用处理过的文件,而是使用原始文件来获取 SNP 基因映射。正如您提到的,此数据是下面 plink command 的输出:
plink --file mydata --make-set gene.list --write-set
所以我们已经有了 gene.list 和 mydata.map 文件。使用这 2 个文件,我们可以执行以下操作:
library(data.table)
# gene list file
geneList <- data.table(
chr = 1:2,
start = c(10, 40),
end = c(13, 45),
gene = paste0("gene_",1:2))
# chr start end gene
# 1: 1 10 13 gene_1
# 2: 2 40 45 gene_2
# map file
map <- data.table(
chr = c(1,1,1,2,2,2,3),
snp = paste0("snp_",1:7),
cm = 0,
bp = c(10,11,15,40,41,49,100))
# prepare for merging, rename colnames to match gene list colnames
map <- map[, list(chr, start = bp, end = bp, snp)]
# chr start end snp
# 1: 1 10 10 snp_1
# 2: 1 11 11 snp_2
# 3: 1 15 15 snp_3
# 4: 2 40 40 snp_4
# 5: 2 41 41 snp_5
# 6: 2 49 49 snp_6
# 7: 3 100 100 snp_7
# set key for merging
setkey(map, chr, start, end)
# merge and susbset snp and gene columns
foverlaps(geneList, map)[, list(snp, gene)]
# snp gene
# 1: snp_1 gene_1
# 2: snp_2 gene_1
# 3: snp_4 gene_2
# 4: snp_5 gene_2
此外,请参阅 this post 了解更多重叠合并 examples/functions。
我有如下数据,基因名称(例如 ABCB9)中包含 SNP 名称(rs 编号或 c#_pos#)。在名为 c#_pos000000 的 SNP 中,# 的范围是 1 到 22(染色体编号)
ABCB9
rs11057374
rs7138100
c22_pos41422393
rs12309481
END
ABCC10
rs1214748
END
HDAC9
rs928578
rs10883039
END
HCN2
rs12428035
rs9561933
c2_pos102345
rs3848077
rs3099362
END
通过使用这些数据,我想使输出如下所示
rs11057374 ABCB9
rs7138100 ABCB9
c22_pos41422393 ABCB9
rs12309481 ABCB9
rs1214748 ABCC10
rs928578 HDAC9
rs10883039 HDAC9
rs12428035 HCN2
rs9561933 HCN2
c2_pos102345 HCN2
rs3848077 HCN2
rs3099362 HCN2
是否有空格不需要"END"
如何在R或linux中输出这个?
我们可以稍微改变一下。使用 readLines
读取文件并删除 leading/lagging 空格 (trimws
) 后,split
'lines1' 基于基于空白值创建的分组向量 (""
), 从 list
元素中删除 ""
或 "END"
字符串,然后设置 list
的 names
与每个的第一次观察list
元素 (sapply(lst1,
[, 1)
) 同时提取除第一个元素和 stack
之外的所有其他元素。
lines1 <- trimws(lines)
lst1 <- lapply(split(lines1, cumsum(lines1=="")),
function(x) x[!x %in% c("", "END")])
stack(setNames(lapply(lst1,`[`,-1), sapply(lst1, `[`,1)))
# values ind
#1 rs11057374 ABCB9
#2 rs7138100 ABCB9
#3 c22_pos41422393 ABCB9
#4 rs12309481 ABCB9
#5 rs1214748 ABCC10
#6 rs928578 HDAC9
#7 rs10883039 HDAC9
#8 rs12428035 HCN2
#9 rs9561933 HCN2
#10 c2_pos102345 HCN2
#11 rs3848077 HCN2
#12 rs3099362 HCN2
数据
lines <- readLines("yourdata.txt")
不要使用处理过的文件,而是使用原始文件来获取 SNP 基因映射。正如您提到的,此数据是下面 plink command 的输出:
plink --file mydata --make-set gene.list --write-set
所以我们已经有了 gene.list 和 mydata.map 文件。使用这 2 个文件,我们可以执行以下操作:
library(data.table)
# gene list file
geneList <- data.table(
chr = 1:2,
start = c(10, 40),
end = c(13, 45),
gene = paste0("gene_",1:2))
# chr start end gene
# 1: 1 10 13 gene_1
# 2: 2 40 45 gene_2
# map file
map <- data.table(
chr = c(1,1,1,2,2,2,3),
snp = paste0("snp_",1:7),
cm = 0,
bp = c(10,11,15,40,41,49,100))
# prepare for merging, rename colnames to match gene list colnames
map <- map[, list(chr, start = bp, end = bp, snp)]
# chr start end snp
# 1: 1 10 10 snp_1
# 2: 1 11 11 snp_2
# 3: 1 15 15 snp_3
# 4: 2 40 40 snp_4
# 5: 2 41 41 snp_5
# 6: 2 49 49 snp_6
# 7: 3 100 100 snp_7
# set key for merging
setkey(map, chr, start, end)
# merge and susbset snp and gene columns
foverlaps(geneList, map)[, list(snp, gene)]
# snp gene
# 1: snp_1 gene_1
# 2: snp_2 gene_1
# 3: snp_4 gene_2
# 4: snp_5 gene_2
此外,请参阅 this post 了解更多重叠合并 examples/functions。