[英]How to looping over a column and if pattern matches, count related characters in other columns using R?
[英]AWK looping through columns to count matches
我有一個制表符分隔的文件,如下所示:
樣品編號 | 單核苷酸多態性 | 最低限度 | 合子 | 樣本1 | 樣品2 | 樣品3 |
---|---|---|---|---|---|---|
311 | rs1490413 | 一種 | 人 | G | 一種 | G |
311 | rs730123 | G | 人 | 一種 | G | 一種 |
311 | rs7532151 | 一種 | 人 | 一種 | C | C |
311 | rs1434369 | G | 人 | 噸 | G | 噸 |
311 | rs1563172 | 噸 | 人 | 噸 | C | C |
理論上,樣本數量以及列 $5-$i 是無限的。
我想計算同一行中同一字母在 3 美元和 5 美元之間,然后是 6 美元,然后是 7 美元等之間的總出現次數,並將結果值除以總行數(標題除外)
到目前為止,我可以為每對分別做,例如 3 美元和 5 美元,如下所示:
awk 'BEGIN {
FS = OFS = "\t"
}
$3 == $5 {
++count
}
END {
print count/(NR-1)
}
' infile
我想循環執行並獲得如下輸出:
樣品編號 | 樣本1 | 樣品2 | 樣品3 |
---|---|---|---|
311 | 0.4 | 0.6 | 0 |
有人可以幫忙嗎?
也許這種方法行得通?
awk '
BEGIN{
OFS="\t"; printf "%s\t", "SampleID"
}
NR==1{
for(i=5;i<=NF;i++){
printf "Sample%s\t", (i-4)
}
}
NR>1{
sample[$1]++
!sampleID[$1]++
for(i=5;i<=NF;i++){
if($3 == $i){
count[$1, i]++
}
}
}
END{
for (j in sampleID) {
print ""
printf "%s\t", j
for(i=5;i<=NF;i++){
printf "%s\t", count[j, i] / sample[j]
}
}
}' inputfile
SampleID Sample1 Sample2 Sample3
311 0.4 0.6 0
這些值不是除以 (NR-1),而是除以 SampleID 行數。 因此,如果文件中有其他 sampleID:
cat test.txt
SampleID dbSNP Min.alle M.zygo Sample1 Sample2 Sample3
311 rs1490413 A Homo G A G
311 rs730123 G Homo A G A
311 rs7532151 A Homo A C C
311 rs1434369 G Homo T G T
311 rs1563172 T Homo T C C
312 rs1490413 A Homo G A G
312 rs730123 G Homo A G A
312 rs7532151 A Homo A C C
312 rs1434369 G Homo T G T
312 rs1563172 G Homo T C C
awk '
BEGIN{
OFS="\t"; printf "%s\t", "SampleID"
}
NR==1{
for(i=5;i<=NF;i++){
printf "Sample%s\t", (i-4)
}
}
NR>1{
sample[$1]++
!sampleID[$1]++
for(i=5;i<=NF;i++){
if($3 == $i){
count[$1, i]++
}
}
}
END{
for (j in sampleID) {
print ""
printf "%s\t", j
for(i=5;i<=NF;i++){
printf "%s\t", count[j, i] / sample[j]
}
}
}' test.txt
SampleID Sample1 Sample2 Sample3
311 0.4 0.6 0
312 0.2 0.6 0
根據文件的大小,可能值得為此任務查看其他語言,即這在 R 中相對微不足道:
library(dplyr)
df <- read.table(text = "SampleID dbSNP Min.alle M.zygo Sample1 Sample2 Sample3
311 rs1490413 A Homo G A G
311 rs730123 G Homo A G A
311 rs7532151 A Homo A C C
311 rs1434369 G Homo T G T
311 rs1563172 T Homo T C C", header = TRUE)
df %>%
group_by(SampleID) %>%
summarise(across(starts_with("Sample"), ~mean(.x == Min.alle)))
#> # A tibble: 1 × 4
#> SampleID Sample1 Sample2 Sample3
#> <int> <dbl> <dbl> <dbl>
#> 1 311 0.4 0.6 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.