Re: [問題] 資料的截取與邏輯判斷

作者: egoweaver (Hiko)   2018-06-28 18:23:38
用 R 解的話大概會是這樣:
# 下載 package 並安裝 (只有第一次執行需要)
install.packages("dplyr")
# 載入需要的 package
library(dplyr)
# 讀取你的原始檔 (假設它是 .csv)
rawdata <- read.csv([path to yourfile], header = TRUE,
stringsAsFactor = FALSE)
# 如果是其他格式
# sep 後面填入資料分隔 column 的符號
# rawdata <- read.table([path to yourfile], header = TRUE,
stringAsFactor = FALSE, sep = "\t")
# 判斷 A_1 A_2 是否相同 (結果存在 con1 這一欄)
rawdata <- mutate(rawdata, con1 = A_1 == A_2)
# 計算相同的列數
sum(rawdata$con1)
# 判斷 A_1 和 A_2 是否是 "./." (結果存在 con2 這一欄)
rawdata <- mutate(rawdata, con2 = (A_1 == "./." & A_2 == "./."))
# 計算 A_1 和 A_2 都是 "./." 的列數
sum(rawdata$con2)
# A_1 和 A_2 不相同的列數
sum(!rawdata$con1) # 把判定從「是否相同」反過來就好
# 計算 "./." 的總量
isSymbol <- rawdata == "./." # 判斷哪些格子的內容是 "./."
numOfSymbol <- rowSums(isSymbol) # 計算每列「是 "./."」的格子總量
啊,打完發現我不是在隔壁版。補個 Linux 點。用 awk 的話其實也滿快的:
# 計算 A_1 與 A_2 相同的列數 (若它們分別為第一第二欄)
awk '$1 == $2 {i++}END{print i}' [your raw data]
# 計算 A_1 與 A_2 都同樣是 ./. 的列數
awk '$1 == "./." && $2 == "./." {i++}END{print i}' [your raw data]
# 計算 A_1 與 A_2 不相同的列數
awk '$1 != $2 {i++}END{print i}' [your raw data]
# 計算每列中有幾個 "./."
awk '{for(i = 1; i <= NF; i++) {if($i == "./.") n++}; \
print n >> "number.txt";}' [your raw data]
# 如果要把 "./." 的個數當作一欄併回原檔案
paste [your raw data] number.txt >> newfile.txt
※ 引述《k97231 (AL)》之銘言:
: 我現在正在處理一些有關於生物資訊的資料
: 基本上的資料格式長這樣
: ID A_1 A_2 B_1 B_2 ……
: 1 0/0 0/0
: 2 0/0 ./.
: 3 ./. ./.
: 4. 0/0 0/1
: 5. 1/1 0/1
: 6. 0/1 0/1
: ……
: 接著我想要做幾件事情
: 依據相同字母的樣本(像是A_1和A_2)
: 逐列統計四種欄位的數量
: 1. A_1和A_2相同
: 2. A_1和A_2都一樣是./.
: 3. A_1和A_2不一樣
: 4. 以及任一樣本含有./.的欄位數量
: 以上表為例
: A_1和A_2相同的數量是3 (ID1, 3, 6)
: 兩行數值都是./.的數量是1
: A_1和A_2不同的列有3 (ID2, 4, 5)
: 有任一行數值為./.的數量為2 (ID2, 3)
: 然後統計成四個數值這樣並輸出
: 不過有問題的部分是要如何擷取含有特定字串的兩欄
: 並逐行進行邏輯判斷?
: 我知道可以利用awk逐行進行擷取並用grep計算數量並輸出 (不過awk和grep的管線順序還沒參透)
: 但要如何依據相同字母擷取特定行就不清楚了
: 想問有甚麼指令可以針對首列帶有特定字串的行進行擷取?
作者: k97231 (AL)   2018-07-02 22:55:00
喔喔 真的好感謝

Links booklink

Contact Us: admin [ a t ] ucptt.com