TWASandGWAS中GBS filtering and GWAS(1)

F:\文章代碼\TWASandGWAS\GBS filtering and GWAS

README.TXT

請檢查幻燈片“Vitamaize_update_Gorelab_Ames_GBS_filtering_20191122.pptx”中關于阿姆斯(Ames)ID處理流程的詳細信息。

文件夾“Ames_ID_processing”包含了用于處理阿姆斯ID的文件和R腳本。
文件“Ames_GBS_raw_filtering_for_imputation.txt”包含了用于過濾GBS(基因組簡化測序)基因型數據以供填補使用的Linux命令。

Ames_ID_processing解讀

1. 導入和準備數據

在這部分,腳本首先加載了處理數據所需的所有R庫。這些庫提供了數據操作、數據可視化、數據重塑等功能。接著,腳本讀取了包含Pedigree信息、位置信息等的CSV文件。這些文件包含了進行后續分析所需的基礎數據。

目的:準備分析環境,導入原始數據。

2. Pedigree信息比較

這一部分的目的是比較不同來源的Pedigree信息,確保數據的一致性。腳本讀取了由Maria和Laura提供的Pedigree信息,并進行了比較,找出兩者之間的差異。

目的:確保Pedigree信息的一致性,為后續分析打下基礎。

3. 處理位置信息

在這一部分,腳本處理了一個包含位置信息的文件。這個文件包含了樣本的位置和來源信息,這些信息對于后續的分析非常重要。

目的:整理和清洗位置信息,確保每個樣本的位置信息準確無誤。

4. 連接Maria端和Laura端的行

這一部分的目的是根據位置信息,將Maria端的樣本與Laura端的源ID進行匹配。這樣可以幫助研究者理解樣本的來源和背景。

目的:將樣本與其來源ID進行關聯,為后續的遺傳分析提供信息。

5. 過濾和處理GBS記錄

在這部分,腳本從Panzea_ZeaGBSv2.7中檢索完整的GBS記錄列表,并根據需要移除甜玉米和爆裂玉米的記錄。

目的:篩選出感興趣的樣本,排除不需要的樣本,如甜玉米和爆裂玉米。

6. 處理和生成鎖定列表

這一部分涉及移除特定的行(如"ae"行和七個通道),生成一個鎖定列表,這個列表包含了經過篩選的樣本。

目的:生成一個清潔的樣本列表,用于后續的遺傳分析。

7. 檢索共同行的GBS記錄

在這一部分,腳本從Panzea_ZeaGBSv2.7中檢索共同行的GBS記錄列表。

目的:獲取用于后續分析的共同樣本的GBS記錄。

8. 數據清洗和驗證

這一部分的目的是驗證和清洗數據,確保數據的質量。這包括修正NPGS中的不一致性,確保數據的一致性。

目的:確保數據的準確性和一致性,為后續分析提供高質量的數據。

9. 生成最終的GBS記錄列表

最后,腳本生成最終的GBS記錄列表,這個列表包含了所有經過篩選和驗證的樣本,可以用于后續的遺傳分析。

目的:生成一個最終的樣本列表,用于后續的遺傳分析。

每個部分都是數據處理流程中不可或缺的一環,確保了從原始數據到分析就緒數據的轉換過程的準確性和可靠性。如果你對某個部分有更具體的問題或需要更詳細的解釋,請告訴我,我可以進一步解釋。


1. 導入和準備數據

首先,我們需要加載R中處理數據所需的庫。這些庫提供了數據操作、數據可視化、數據重塑等功能。

# 加載必要的庫
library(gdata)
library(reshape2)
library(ggplot2)
library(Hmisc)
library(dplyr)
library(gridExtra)

解釋

  • gdata:用于數據處理。
  • reshape2:用于數據重塑,例如從寬格式轉換為長格式。
  • ggplot2:一個流行的數據可視化庫,用于創建高質量的圖形。
  • Hmisc:提供額外的數據操作工具。
  • dplyr:提供數據操作函數,特別是對數據框(data frame)的操作。
  • gridExtra:提供額外的圖形布局功能。

這些庫是進行數據分析和可視化的基礎,確保了后續步驟可以順利進行。

接下來,我們將讀取包含Pedigree信息、位置信息等的CSV文件。這些文件包含了進行后續分析所需的基礎數據。

# 讀取Pedigree信息文件
coder <- read.csv('entry_coder_isu.csv',header = TRUE)
coder_ex <- coder[which(coder$Pedigree!= "B73"),]
coder_p_dup <- coder_ex[duplicated2(coder_ex$Pedigree),] # 12 pedigree_dup
coder_s_dup <- coder_ex[duplicated2(coder_ex$Source),] # zero source_dup
write.csv(coder_p_dup ,file="coder_p_dup.csv", row.names = F)

解釋

  • read.csv:讀取CSV文件,header = TRUE表示文件的第一行包含列名。
  • coder <- coder[which(coder$Pedigree!= "B73"),]:篩選出Pedigree不是"B73"的行。
  • duplicated2:用于找出重復值的行。
  • coder_p_dup <- coder_ex[duplicated2(coder_ex$Pedigree),]:找出Pedigree列中重復的行。
  • write.csv:將結果寫入新的CSV文件。

這部分代碼的目的是從Pedigree信息中篩選出非"B73"的樣本,并找出其中的重復項,然后將這些重復項寫入新的文件中。


2. Pedigree信息比較

這一部分的目的是確保不同來源的Pedigree信息的一致性,并處理不同年份的數據。

### d2015_vb
d2015_vb <- read.csv('Ames 2015 - BVits Final_021518.csv',header = TRUE)  # 1802 lines
d2015_vb <- d2015_vb[,c(6,8,9)]
d2015_vb$Range_Pass_2015_vb <- paste(d2015_vb$Range,d2015_vb$Pass,sep="_")
d2015_vb_c <- merge(d2015_vb,coder,by.x="Range_Pass_2015_vb",by.y="Range_Pass_2015")
d2015_vb_c_dif <- d2015_vb_c[which(as.character(d2015_vb_c$Pedigree.x)!=as.character(d2015_vb_c$Pedigree.y)),]### d2015_ve
d2015_ve <- read.csv('AMES15 - TOCOCHROMATICS - REVISED_022219.csv',header = TRUE) # 1801 lines
d2015_ve <- d2015_ve[,c(6,8,9)]
d2015_ve$Range_Pass_2015_ve <- paste(d2015_ve$Range,d2015_ve$Pass,sep="_")
d2015_ve_c <- merge(d2015_ve,coder,by.x="Range_Pass_2015_ve",by.y="Range_Pass_2015")
d2015_ve_c_dif <- d2015_ve_c[which(as.character(d2015_ve_c$Pedigree.x)!=as.character(d2015_ve_c$Pedigree.y)),]d2015_dif <-merge(d2015_vb_c_dif,d2015_ve_c_dif,by.x="Range_Pass_2015_vb",by.y="Range_Pass_2015_ve",all=T)
write.csv(d2015_dif ,file="d2015_dif.csv", row.names = F)

解釋

  • read.csv:讀取CSV文件,header = TRUE表示文件的第一行包含列名。
  • d2015_vb <- d2015_vb[,c(6,8,9)]:選擇特定的列(第6、8、9列)。
  • paste:將RangePass列合并為一個新列Range_Pass_2015_vb
  • merge:合并兩個數據框(data frame),基于共同的列。
  • which(as.character(d2015_vb_c$Pedigree.x)!=as.character(d2015_vb_c$Pedigree.y)):找出兩個Pedigree列值不匹配的行。
  • write.csv:將結果寫入新的CSV文件。

這部分代碼首先讀取2015年的兩個數據集(d2015_vbd2015_ve),然后分別與coder數據框合并,以比較Pedigree信息。接著,找出兩個Pedigree列值不匹配的行,并將這些行寫入新的CSV文件d2015_dif.csv中。


3. 處理位置信息

這一部分的目的是檢查和處理包含樣本位置信息的文件,以確保后續分析中樣本位置的準確性。

### 讀取原始文件
key <- read.csv('location_to_Source_15-17_key.csv', header = TRUE) # 3790 rows
### 添加 "id" 列
key$id <- paste(key$Year, key$Range, key$Pass, sep="_")
key_dup <- key[duplicated(key$id),] # 10 rows with duplications
write.csv(key_dup, file="key_dup.csv", row.names = F)
### 移除10行重復項
key_u <- distinct(key, id, .keep_all = TRUE) # 3790 - 10 = 3780 rows
write.csv(key_u, file="location_to_Source_15-17_key_update.csv", row.names = F)### 讀取更新后的key文件
key <- read.csv('location_to_Source_15-17_key_update.csv', header = TRUE) # 3780 rows

解釋

  • read.csv:讀取包含位置信息的CSV文件。
  • paste:創建一個新的列id,該列是通過將YearRangePass列合并生成的,用于唯一標識每一行。
  • duplicated:找出id列中重復的行。
  • write.csv:將包含重復項的數據框寫入新的CSV文件key_dup.csv中。
  • distinct:移除數據框中的重復行,保留唯一的行。
  • key_u:更新后的無重復項數據框。

這部分代碼首先讀取位置信息文件,然后創建一個新的唯一標識列id。接著,代碼找出并移除了重復的行,最后將更新后的數據框寫入新的CSV文件中。


4. 連接Maria端的行與Laura端的源ID

這一部分的目的是將Maria端的行數據與Laura端的源ID進行匹配,以便將樣本的基因型信息與其來源聯系起來。

### 加載必要的庫
library(gdata)
library(reshape2)
library(ggplot2)
library(Hmisc)
library(dplyr)
library(gridExtra)### 讀取更新后的key文件
key <- read.csv('location_to_Source_15-17_key_update.csv', header = TRUE) # 3780 rows### d2015_vb
d2015_vb <- read.csv('Ames 2015 - BVits Final_021518.csv', header = TRUE)  # 1802 lines
d2015_vb <- d2015_vb[,c(6,8,9)]
d2015_vb$id_2015_vb <- paste("2015", d2015_vb$Range, d2015_vb$Pass, sep="_")
d2015_vb_k <- merge(d2015_vb, key, by.x="id_2015_vb", by.y="id")
d2015_vb_k_dif <- d2015_vb_k[which(as.character(d2015_vb_k$Pedigree.x) != as.character(d2015_vb_k$Pedigree.y)),]### d2015_ve
d2015_ve <- read.csv('AMES15 - TOCOCHROMATICS - REVISED_022219.csv', header = TRUE) # 1801 lines
d2015_ve <- d2015_ve[,c(6,8,9)]
d2015_ve$id_2015_ve <- paste("2015", d2015_ve$Range, d2015_ve$Pass, sep="_")
d2015_ve_k <- merge(d2015_ve, key, by.x="id_2015_ve", by.y="id")
d2015_ve_k_dif <- d2015_ve_k[which(as.character(d2015_ve_k$Pedigree.x) != as.character(d2015_ve_k$Pedigree.y)),]### d2017_vb
d2017_vb <- read.csv('Ames 2017_BVits_FINAL_d3Thiamine corrected and plate info corrected_022219.csv', header = TRUE) # 1748 lines
d2017_vb <- d2017_vb[,c(6,8,9)]
d2017_vb$id_2017_vb <- paste("2017", d2017_vb$Range, d2017_vb$Pass, sep="_")
d2017_vb_k <- merge(d2017_vb, key, by.x="id_2017_vb", by.y="id")
d2017_vb_k_dif <- d2017_vb_k[which(as.character(d2017_vb_k$Pedigree.x) != as.character(d2017_vb_k$Pedigree.y)),]### d2017_ve
d2017_ve <- read.csv('AMES 2017_TOCOCHROMATICS_FINAL_.csv', header = TRUE) # 1738 lines
d2017_ve <- d2017_ve[,c(6,8,9)]
d2017_ve$id_2017_ve <- paste("2017", d2017_ve$Range, d2017_ve$Pass, sep="_")
d2017_ve_k <- merge(d2017_ve, key, by.x="id_2017_ve", by.y="id")
d2017_ve_k_dif <- d2017_ve_k[which(as.character(d2017_ve_k$Pedigree.x) != as.character(d2017_ve_k$Pedigree.y)),]### 比較Pedigree信息,完成!

解釋

  • 首先,代碼加載了必要的R庫,以便進行數據處理和分析。
  • 然后,代碼讀取了更新后的key文件,該文件包含了樣本的位置和來源信息。
  • 對于2015年和2017年的數據,代碼分別讀取了兩個數據集(d2015_vbd2017_vbd2015_ved2017_ve),并選擇了特定的列。
  • 接著,代碼為每個數據集創建了一個新的id列,該列是通過合并RangePass列生成的,用于唯一標識每一行。
  • 然后,代碼將每個數據集與key文件合并,以將樣本的基因型信息與其來源信息關聯起來。
  • 最后,代碼找出了兩個Pedigree列值不匹配的行,并進行了處理。

5. 生成Ames ID完整列表以用于GBS提取

這一部分的目的是生成一個完整的Ames ID列表,用于后續的基因組簡化測序(GBS)提取工作。

### 加載必要的庫
library(gdata)
library(reshape2)
library(ggplot2)
library(Hmisc)
library(dplyr)
library(gridExtra)### 讀取更新后的key文件
key <- read.csv('location_to_Source_2015-17_key_update.csv', header = TRUE) # 3780 rows### d2015_vb
d2015_vb <- read.csv('Ames_2015_vb_adding_ID.csv', header = TRUE)  # 1802 lines
d2015_vb$id_2015_vb <- paste("2015", d2015_vb$Range, d2015_vb$Pass, sep="_")
d2015_vb_k <- merge(d2015_vb, key, by.x="id_2015_vb", by.y="id")
d2015_vb_k2 <- d2015_vb_k[,c(2:6,31:33,27:28,8:26)]
colnames(d2015_vb_k2)[5] <- "Source"
colnames(d2015_vb_k2)[7] <- "Pedigree"
colnames(d2015_vb_k2)[8] <- "ID"
colnames(d2015_vb_k2)[12] <- "Range"
colnames(d2015_vb_k2)[13] <- "Pass"
### 檢查每個行是否只被測量了一次
d2015_vb_k2_dup <- d2015_vb_k2[duplicated2(d2015_vb_k2$PedId),] # yes
write.csv(d2015_vb_k2 ,file="Ames_2015_vb_adding_ID.csv", row.names = F)#### d2015_ve
d2015_ve <- read.csv('Ames_2015_ve_adding_ID.csv', header = TRUE) # 1801 lines
d2015_ve$id_2015_ve <- paste("2015", d2015_ve$Range, d2015_ve$Pass, sep="_")
d2015_ve_k <- merge(d2015_ve, key, by.x="id_2015_ve", by.y="id")
d2015_ve_k2 <- d2015_ve_k[,c(2:6,31:33,27:28,8:26)]
colnames(d2015_ve_k2)[5] <- "Source"
colnames(d2015_ve_k2)[7] <- "Pedigree"
colnames(d2015_ve_k2)[8] <- "ID"
colnames(d2015_ve_k2)[12] <- "Range"
colnames(d2015_ve_k2)[13] <- "Pass"
### 檢查每個行是否只被測量了一次
d2015_ve_k2_dup <- d2015_ve_k2[duplicated2(d2015_ve_k2$PedId),] # yes
write.csv(d2015_ve_k2 ,file="Ames_2015_ve_adding_ID.csv", row.names = F)#### d2017_vb
d2017_vb <- read.csv('Ames_2017_vb_adding_ID.csv', header = TRUE) # 1748 lines
d2017_vb$id_2017_vb <- paste("2017", d2017_vb$Range, d2017_vb$Pass, sep="_")
d2017_vb_k <- merge(d2017_vb, key, by.x="id_2017_vb", by.y="id")
d2017_vb_k2 <- d2017_vb_k[,c(2:6,31:33,27:28,8:26)]
colnames(d2017_vb_k2)[5] <- "Source"
colnames(d2017_vb_k2)[7] <- "Pedigree"
colnames(d2017_vb_k2)[8] <- "ID"
colnames(d2017_vb_k2)[12] <- "Range"
colnames(d2017_vb_k2)[13] <- "Pass"
### 檢查每個行是否只被測量了一次
d2017_vb_k2_dup <- d2017_vb_k2[duplicated2(d2017_vb_k2$PedId),] # 10 samples were measured two times
### 為了保持一致性,移除那些在Plate 19上測量兩次的10個樣本
remove_id <- d2017_vb_k2_dup[which(d2017_vb_k2_dup$LCMS.Plate=="Ames17-BV-19L"),c(1:3)]
all_row <- NULL # 獲取行號
for (i in 1:10){tmp_row <- which(d2017_vb_k2$LCMS.Plate=="Ames17-BV-19L" & d2017_vb_k2$PedId==remove_id$PedId[i] )all_row <- c(all_row,tmp_row)
}
d2017_vb_k3 <- d2017_vb_k2[-all_row,]
d2017_vb_k3_dup <- d2017_vb_k3[duplicated2(d2017_vb_k3$PedId),]#### d2017_ve
d2017_ve <- read.csv('Ames_2017_ve_adding_ID.csv', header = TRUE) # 1738 lines
d2017_ve$id_2017_ve <- paste("2017", d2017_ve$Range, d2017_ve$Pass, sep="_")
d2017_ve_k <- merge(d2017_ve, key, by.x="id_2017_ve", by.y="id")
d2017_ve_k2 <- d2017_ve_k[,c(2:6,30:32,26:27,8:25)]
colnames(d2017_ve_k2)[5] <- "Source"
colnames(d2017_ve_k2)[7] <- "Pedigree"
colnames(d2017_ve_k2)[8] <- "ID"
colnames(d2017_ve_k2)[12] <- "Range"
colnames(d2017_ve_k2)[13] <- "Pass"
### 檢查每個行是否只被測量了一次
d2017_ve_k2_dup <- d2017_ve_k2[duplicated2(d2017_ve_k2$PedId),] # all samples were measured one time### 連接Maria端的行與Laura端的源ID,完成!

解釋

  • 首先,代碼加載了必要的R庫,以便進行數據處理和分析。
  • 然后,代碼讀取更新后的key文件,該文件包含了樣本的位置和來源信息。
  • 對于2015年和2017年的數據,代碼分別讀取了兩個數據集(d2015_vbd2017_vbd2015_ved2017_ve),并選擇了特定的列。
  • 接著,代碼為每個數據集創建了一個新的id列,該列是通過合并RangePass列生成的,用于唯一標識每一行。
  • 然后,代碼將每個數據集與key文件合并,以將樣本的基因型信息與其來源信息關聯起來。
  • 最后,代碼檢查了每個行是否只被測量了一次,并進行了相應的處理。

這部分代碼的目的是將樣本的基因型信息與其來源信息進行匹配,以便進行后續的遺傳分析。如果你對這部分代碼理解清楚了,我們可以繼續講解下一部分。


6. 從Panzea_ZeaGBSv2.7中檢索完整的GBS記錄列表

這一部分的目的是從Panzea_ZeaGBSv2.7數據集中檢索與Ames ID相關的所有GBS記錄,以便進行后續的基因型分析。

### 加載必要的庫
library(gdata)
library(reshape2)
library(ggplot2)
library(Hmisc)
library(dplyr)
library(gridExtra)### 讀取Ames ID完整列表
ames_isu <- read.csv(file="ames_isu_id.csv",stringsAsFactors=FALSE)### 讀取Panzea_ZeaGBSv2.7的記錄列表
v2.7 <- read.csv(file="Panzea_ZeaGBSv2.7_id.csv")### 清洗和格式化ID列
ames_isu$ID_clean <- ames_isu$ID
ames_isu$ID_clean <- gsub(' ','',ames_isu$ID_clean)
ames_isu$ID_clean <- tolower(ames_isu$ID_clean)v2.7$acc_v2.7_clean <- v2.7$acc_v2.7
v2.7$acc_v2.7_clean <- gsub(' ','',v2.7$acc_v2.7_clean)
v2.7$acc_v2.7_clean <- gsub('-','',v2.7$acc_v2.7_clean)
v2.7$acc_v2.7_clean <- gsub('_','',v2.7$acc_v2.7_clean)
v2.7$acc_v2.7_clean <- gsub('\\(','',v2.7$acc_v2.7_clean)
v2.7$acc_v2.7_clean <- gsub('\\)','',v2.7$acc_v2.7_clean)
v2.7$acc_v2.7_clean <- tolower(v2.7$acc_v2.7_clean)### 合并數據框
ames_isu_v2.7 <- merge(ames_isu, v2.7, by.x="ID_clean", by.y="acc_v2.7_clean",all = T)### 過濾掉沒有GBS記錄的樣本
ames_isu_v2.7 <- ames_isu_v2.7[which(!is.na(ames_isu_v2.7$INDV)),]### 保存結果
write.csv(ames_isu_v2.7 ,file="ames_isu_v2.7_all.csv", row.names = F)

解釋

  • 首先,代碼加載了必要的R庫。
  • 然后,代碼讀取了Ames ID的完整列表(ames_isu)和Panzea_ZeaGBSv2.7的記錄列表(v2.7)。
  • 接著,代碼對ID列進行了清洗和格式化,以確保它們可以正確匹配。
  • 之后,代碼合并了這兩個數據框,以將Ames ID與對應的GBS記錄關聯起來。
  • 最后,代碼過濾掉了沒有GBS記錄的樣本,并將結果保存到CSV文件中。

這部分代碼的目的是生成一個包含所有Ames ID及其對應GBS記錄的完整列表,這對于后續的遺傳分析非常重要。如果你對這部分代碼理解清楚了,我們可以繼續講解下一部分。


7. 移除甜玉米和爆裂玉米

這一部分的目的是從GBS記錄列表中移除甜玉米和爆裂玉米的記錄,因為這些樣本可能對分析結果產生干擾。

### 加載必要的庫
library(gdata)
library(reshape2)
library(ggplot2)
library(Hmisc)
library(dplyr)
library(gridExtra)### 讀取Ames ID完整列表
ames_isu <- read.csv(file="ames_isu_id.csv", header = TRUE)### 讀取包含玉米品種信息的文件
ames_2013gb <- read.csv('13059_2013_103_MOESM1_ESM.csv', header = TRUE) # 品種列表### 為Ames ID添加清洗后的格式
ames_isu$ID_cleanformat <- ames_isu$ID
ames_isu$ID_cleanformat <- gsub(' ','', ames_isu$ID_cleanformat)
ames_isu$ID_cleanformat <- tolower(ames_isu$ID_cleanformat)### 合并品種列表和Ames ID列表
ames_isu_gb <- merge(ames_isu, ames_2013gb, by.x="ID_cleanformat", by.y="Accesion.N", all=T)### 修正Cinta列表中的重復錯誤
ames_isu_gb_dup <- ames_isu_gb[duplicated(ames_isu_gb$ID_cleanformat),]
ames_isu_gb <- ames_isu_gb[-which(ames_isu_gb$ID_cleanformat == "ames27101" & ames_isu_gb$Breeding.program == "Ontario"),]
ames_isu_gb <- ames_isu_gb[-which(ames_isu_gb$ID_cleanformat == "pi543850" & ames_isu_gb$Breeding.program == "Other"),]
ames_isu_gb <- ames_isu_gb[,-c(5:11)]
ames_isu_gb$Comments_merged <- paste(ames_isu_gb$Comments, ames_isu_gb$Pop.structure, sep="_")
table(ames_isu_gb$Comments_merged)
ames_isu_gb$Comments_isu_gb <- "other"
ames_isu_gb$Comments_note <- "ok"
ames_isu_gb$Comments_isu_gb[which(ames_isu_gb$Comments_merged == "popcorn or sweet corn_unclassified")] <- "popcorn or sweet corn_unclassified"
ames_isu_gb$Comments_note[which(ames_isu_gb$Comments_merged == "popcorn or sweet corn_unclassified")] <- "in_question"
ames_isu_gb$Comments_isu_gb[which(ames_isu_gb$Comments_merged == "popcorn_popcorn")] <- "popcorn"
ames_isu_gb$Comments_note[which(ames_isu_gb$Comments_merged == "popcorn_popcorn")] <- "in_question"
ames_isu_gb$Comments_isu_gb[which(ames_isu_gb$Comments_merged == "popcorn_unclassified")] <- "popcorn_unclassified"
ames_isu_gb$Comments_note[which(ames_isu_gb$Comments_merged == "popcorn_unclassified")] <- "in_question"
ames_isu_gb$Comments_isu_gb[which(ames_isu_gb$Comments_merged == "sweet corn_NA")] <- "sweet corn_NA"
ames_isu_gb$Comments_note[which(ames_isu_gb$Comments_merged == "sweet corn_NA")] <- "in_question"
ames_isu_gb$Comments_isu_gb[which(ames_isu_gb$Comments_merged == "sweet corn_non-stiff stalk")] <- "sweet corn_non-stiff stalk"
ames_isu_gb$Comments_note[which(ames_isu_gb$Comments_merged == "sweet corn_non-stiff stalk")] <- "in_question"
ames_isu_gb$Comments_isu_gb[which(ames_isu_gb$Comments_merged == "sweet corn_stiff stalk")] <- "sweet corn_stiff stalk"
ames_isu_gb$Comments_note[which(ames_isu_gb$Comments_merged == "sweet corn_stiff stalk")] <- "in_question"
ames_isu_gb$Comments_isu_gb[which(ames_isu_gb$Comments_merged == "sweet corn_sweet corn")] <- "sweet corn"
ames_isu_gb$Comments_isu_gb[which(ames_isu_gb$Comments_merged == "sweet corn_unclassified")] <- "sweet corn_unclassified"
ames_isu_gb$Comments_note[which(ames_isu_gb$Comments_merged == "sweet corn_unclassified")] <- "in_question"ames_isu_gb <- ames_isu_gb[,-c(4:6)]
in_ques_38 <- ames_isu_gb[which(ames_isu_gb$Comments_note=="in_question"),] ### 38 accessions
write.csv(in_ques_38,file="ames_isu_in_question_38.csv", row.names = F)### 檢查這些訪問號在NPGS中的信息并修正差異
npgs_38 <- read.csv('ames_isu_in_question_38_npgs.csv', header = TRUE,stringsAsFactors=FALSE) ### 36 of the 38 in_question were fixed
ames_isu_gb_ok <- ames_isu_gb[which(ames_isu_gb$Comments_note=="ok"),]for (i in c(1:38)) {if (npgs_38$NPGS[i]=="sweet corn"|npgs_38$NPGS[i]=="popcorn") { npgs_38$Comments_note[i] <- "ok" npgs_38$Comments_isu_gb[i] <- npgs_38$NPGS[i]}if (npgs_38$Comments_note[i]=="in_question") { npgs_38$Comments_note[i] <- paste(npgs_38$Comments_note[i],"_NPGS_", npgs_38$NPGS[i],sep="")}
}ames_isu_gb_npgs38 <- rbind(ames_isu_gb_ok,npgs_38[,c(1:5)])
write.csv(ames_isu_gb_npgs38,file="ames_isu_gb_npgs38.csv", row.names = F)### 合并Di的列表信息
ames_isu_gb_npgs38 <- read.csv('ames_isu_gb_npgs38.csv', header = TRUE)
check_83 <- read.csv('lines_to_check_sweet_pop_vitamaize_master.csv', header = TRUE)
ames_isu_gb_npgs38 <- merge(ames_isu_gb_npgs38, check_83, by="ID_cleanformat",all=T)
ames_isu_gb_npgs38 <- ames_isu_gb_npgs38[which(!is.na(ames_isu_gb_npgs38$ID)),]
table(ames_isu_gb_npgs38$GRIN)for (i in c(1:1762)) {if (!is.na(ames_isu_gb_npgs38$GRIN[i]) & ames_isu_gb_npgs38$GRIN[i]=="popcorn") { ames_isu_gb_npgs38$Comments_isu_gb[i] <- ames_isu_gb_npgs38$GRIN[i]ames_isu_gb_npgs38$Comments_note[i] <- "ok" }if (!is.na(ames_isu_gb_npgs38$GRIN[i]) & ames_isu_gb_npgs38$GRIN[i]=="unknown") { ames_isu_gb_npgs38$Comments_note[i] <- "in_question_NPGS_unknown"}
}
write.csv(ames_isu_gb_npgs38[,c(1:5)],file="ames_isu_gb_npgs38_npgs8.csv", row.names = F) ### with four accessions still in question

解釋

  • 代碼首先讀取了Ames ID完整列表和包含玉米品種信息的文件。
  • 接著,代碼對ID列進行了清洗和格式化,以確保它們可以正確匹配。
  • 然后,代碼合并了這兩個數據框,以將Ames ID與對應的品種信息關聯起來。
  • 代碼修正了Cinta列表中的重復錯誤,移除了重復的行。
  • 代碼檢查了這些訪問號在NPGS中的信息并修正了差異。
  • 最后,代碼合并了Di的列表信息,生成了最終的品種列表。

這部分代碼的目的是從GBS記錄列表中移除甜玉米和爆裂玉米的記錄,以確保分析結果的準確性。如果你對這部分代碼理解清楚了,我們可以繼續講解下一部分。


8. 比較甜玉米和爆裂玉米列表與Laura的列表

這一部分的目的是確保我們移除的甜玉米和爆裂玉米列表與Laura提供的列表一致,從而保證數據的一致性。

### 加載必要的庫
library(gdata)
library(reshape2)
library(ggplot2)
library(Hmisc)
library(dplyr)
library(gridExtra)### 讀取Ames ID完整列表
ames_isu <- read.csv('ames_isu_gb_npgs38_npgs83.csv', header = TRUE)### 讀取Laura提供的甜玉米和爆裂玉米列表
check_83 <- read.csv('sweet.and.pop.for.Di.Source_Laura.csv', header = TRUE)### 從我們的列表中移除Laura列表中的樣本
ames_isu_gb <- ames_isu_gb[!(ames_isu_gb$ID %in% check_83$Source),]### 比較我們的列表和Laura的列表,確保一致性
ames_isu_gb$ID_cleanformat <- gsub(' ','', ames_isu_gb$ID)
ames_isu_gb$ID_cleanformat <- tolower(ames_isu_gb$ID_cleanformat)check_83$ID_cleanformat <- gsub(' ','', check_83$Source)
check_83$ID_cleanformat <- tolower(check_83$ID_cleanformat)### 合并兩個列表,找出差異
mer <- merge(ames_isu_gb, check_83, by="ID_cleanformat", all=T)### 檢查是否有不一致的樣本
mer_oth <- mer[is.na(mer$Gen),]
mer_oth_sp <- mer_oth[which(mer_oth$Comments_isu_gb!="other"),] ### sp did not contain additional sweet or pop### 檢查一致性
mer_con <- mer[!is.na(mer$Gen),]
mer_con$comment_merge <- paste(mer_con$Comments_isu_gb,"#",mer_con$Comments,sep="")
table(mer_con$comment_merge)
ques <- mer_con[which(mer_con$Comments_isu_gb=="other"),] ### these 2 lines are in-question from the Comments_note### 完成:我們的甜玉米和爆裂玉米列表與Laura的相同

解釋

  • 首先,代碼讀取了我們之前生成的Ames ID列表(ames_isu_gb_npgs38_npgs3.csv)和Laura提供的甜玉米和爆裂玉米列表(sweet.and.pop.for.Di.Source_Laura.csv)。
  • 接著,代碼從我們的列表中移除了Laura列表中的樣本,確保我們的列表與Laura的列表一致。
  • 然后,代碼對ID列進行了清洗和格式化,以確保它們可以正確匹配。
  • 之后,代碼合并了兩個列表,以找出任何可能的差異。
  • 最后,代碼檢查了合并后的列表,找出不一致的樣本,并確認我們的列表與Laura的列表是否一致。

這部分代碼的目的是確保我們的甜玉米和爆裂玉米列表與Laura提供的列表一致,從而保證數據的一致性和可靠性。如果你對這部分代碼理解清楚了,我們可以繼續講解下一部分。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83088.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83088.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83088.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖像處理篇---opencv實現坐姿檢測

文章目錄 前言一、方法概述使用OpenCV和MediaPipe關鍵點檢測角度計算姿態評估 二、完整代碼實現三、代碼說明PostureDetector類find_pose()get_landmarks()cakculate_angle()evaluate_posture() 坐姿評估標準&#xff08;可進行參數調整&#xff09;&#xff1a;可視化功能&…

.Net HttpClient 使用代理功能

HttpClient 使用代理功能 實際開發中&#xff0c;HttpClient 通過代理訪問目標服務器是常見的需求。 本文將全面介紹如何在 .NET 中配置 HttpClient 使用代理&#xff08;Proxy&#xff09;功能&#xff0c;包括基礎使用方式、代碼示例、以及與依賴注入結合的最佳實踐。 注意…

【學習路線】 游戲客戶端開發入門到進階

目錄 游戲客戶端開發入門到進階&#xff1a;系統學習路線與推薦書單一、學習總原則&#xff1a;從底層出發&#xff0c;項目驅動&#xff0c;持續迭代二、推薦學習路線圖&#xff08;初學者→進階&#xff09;第一階段&#xff1a;語言基礎與編程思維第二階段&#xff1a;游戲開…

精益數據分析(57/126):創業移情階段的核心要點與實踐方法

精益數據分析&#xff08;57/126&#xff09;&#xff1a;創業移情階段的核心要點與實踐方法 在創業的浩瀚征程中&#xff0c;每一個階段都承載著獨特的使命與挑戰。今天&#xff0c;我們繼續秉持共同進步的理念&#xff0c;深入研讀《精益數據分析》&#xff0c;聚焦創業的首…

015枚舉之滑動窗口——算法備賽

滑動窗口 最大子數組和 題目描述 給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 原題鏈接 思路分析 見代碼注解 代碼 int maxSubArray(vector<int>& num…

微軟系統 紅帽系統 網絡故障排查:ping、traceroute、netstat

在微軟&#xff08;Windows&#xff09;和紅帽&#xff08;Red Hat Enterprise Linux&#xff0c;RHEL&#xff09;等系統中&#xff0c;網絡故障排查是確保系統正常運行的重要環節。 ping、traceroute&#xff08;在Windows中為tracert&#xff09;和netstat是三個常用的網絡…

解構認知邊界:論萬能方法的本體論批判與方法論重構——基于跨學科視閾的哲學-科學辯證

一、哲學維度的本體論批判 &#xff08;1&#xff09;理性主義的坍縮&#xff1a;從笛卡爾幻想到哥德爾陷阱 笛卡爾在《方法論》中構建的理性主義范式&#xff0c;企圖通過"普遍懷疑-數學演繹"雙重機制確立絕對方法體系。然而哥德爾不完備定理&#xff08;Gdel, 19…

【網絡入侵檢測】基于源碼分析Suricata的IP分片重組

【作者主頁】只道當時是尋常 【專欄介紹】Suricata入侵檢測。專注網絡、主機安全&#xff0c;歡迎關注與評論。 目錄 目錄 1.概要 2. 配置信息 2.1 名詞介紹 2.2 defrag 配置 3. 代碼實現 3.1 配置解析 3.1.1 defrag配置 3.1.2 主機系統策略 3.2 分片重組模塊 3.2.1…

二分查找的邊界問題

前言 二分查找(Binary Search)是一種高效的查找算法&#xff0c;時間復雜度為O(log n)。它適用于已排序的數組或列表。本文將詳細介紹二分查找的兩種常見寫法&#xff1a;閉區間寫法和左閉右開區間寫法。 一、二分查找基本思想 二分查找的核心思想是"分而治之"&am…

重慶醫科大學附屬第二醫院外科樓外擋墻自動化監測

1.項目概述 重慶醫科大學附屬第二醫院&#xff0c;重醫附二院&#xff0c;是集醫療、教學、科研、預防保健為一體的國家三級甲等綜合醫院。前身為始建于1892年的“重慶寬仁醫院”。醫院現有開放床位 1380張&#xff0c;年門診量超過百萬人次&#xff0c;年收治住院病人4.5萬人…

【Redis實戰篇】秒殺優化

1. 秒殺優化-異步秒殺思路 我們來回顧一下下單流程 當用戶發起請求&#xff0c;此時會請求nginx&#xff0c;nginx會訪問到tomcat&#xff0c;而tomcat中的程序&#xff0c;會進行串行操作&#xff0c;分成如下幾個步驟 1、查詢優惠卷 2、判斷秒殺庫存是否足夠 3、查詢訂單…

【idea】調試篇 idea調試技巧合集

前言&#xff1a;之前博主寫過一篇idea技巧合集的文章&#xff0c;由于技巧過于多了&#xff0c;文章很龐大&#xff0c;所以特地將調試相關的技巧單獨成章, 調試和我們日常開發是息息相關的&#xff0c;用好調試可以事半功倍 文章目錄 1. idea調試異步線程2. idea調試stream流…

postman 用法 LTS

postman 用法 LTS File ---- View ---- Show Postman Console

MySQL 數據庫故障排查指南

MySQL 數據庫故障排查指南 本指南旨在幫助您識別和解決常見的 MySQL 數據庫故障。我們將從問題識別開始&#xff0c;逐步深入到具體的故障類型和排查步驟。 1. 問題識別與信息收集 在開始排查之前&#xff0c;首先需要清晰地了解問題的現象和范圍。 故障現象&#xff1a; 數…

用AI寫簡歷是否可行?

讓AI批量寫簡歷然后投簡歷是絕對不行的&#xff01;&#xff01;&#xff01; 為什么不行&#xff0c;按照 "招聘經理" 工作經歷舉例&#xff1a; ai提示詞&#xff1a;請幫我寫一份招聘經理的工作經歷內容&#xff1a; 招聘經理 | XXX科技有限公司 | 2020年…

【從零實現JsonRpc框架#1】Json庫介紹

1.JsonCpp第三方庫 JSONCPP 是一個開源的 C 庫&#xff0c;用于解析和生成 JSON&#xff08;JavaScript Object Notation&#xff09;數據。它提供了簡單易用的接口&#xff0c;支持 JSON 的序列化和反序列化操作&#xff0c;適用于處理配置文件、網絡通信數據等場景。 2.Jso…

Ubuntu——執行echo $USE什么都不顯示

問題&#xff1a;“執行 echo $USER 什么都不顯示”&#xff1f; 一、原因分析 環境變量 $USER 未正確設置 $USER 是系統自動定義的環境變量&#xff0c;通常用于表示當前登錄的用戶名。若該變量未設置或為空&#xff0c;執行 echo $USER 會無輸出。可能場景&#xff1a; 用戶通…

uni-app學習筆記五--vue3插值表達式的使用

vue3快速上手導航&#xff1a;簡介 | Vue.js 模板語法 插值表達式 最基本的數據綁定形式是文本插值&#xff0c;它使用的是“Mustache”語法 (即雙大括號)&#xff1a; <span>Message: {{ msg }}</span> 雙大括號標簽會被替換為相應組件實例中 msg 屬性的值。同…

【PSINS工具箱】基于工具箱的單獨GNSS導航、單獨INS導航、兩者結合組合導航,三種導航的對比程序。附完整的代碼

本文給出基于PSINS工具箱的單獨GNSS導航、單獨INS導航、兩者結合組合導航(153EKF)的程序。并提供三者的軌跡對比、誤差對比。 文章目錄 運行結果MATLAB代碼代碼的簡單介紹簡介2. 平均絕對誤差 (MAE)主要模塊運行結果 三軸軌跡圖: 各軸誤差曲線: 命令行窗口的結果輸出: …

C. scanf 函數基礎

scanf 函數 1. scanf 函數基礎1.1 函數原型與頭文件1.2 格式化輸入的基本概念2.1 常見格式說明符整數格式說明符浮點數格式說明符字符和字符串格式說明符其他格式說明符2.2 格式說明符的高級用法寬度修飾符精度修飾符跳過輸入字段寬度組合修飾符對齊修飾符實際應用示例3.2 精度…