当前位置: 首页 > news >正文

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提供的列表一致,从而保证数据的一致性和可靠性。如果你对这部分代码理解清楚了,我们可以继续讲解下一部分。

相关文章:

TWASandGWAS中GBS filtering and GWAS(1)

F:\文章代码\TWASandGWAS\GBS filtering and GWAS README.TXT 请检查幻灯片“Vitamaize_update_Gorelab_Ames_GBS_filtering_20191122.pptx”中关于阿姆斯&#xff08;Ames&#xff09;ID处理流程的详细信息。 文件夹“Ames_ID_processing”包含了用于处理阿姆斯ID的文件和R…...

Linux电源管理(五),发热管理(thermal),温度控制

更多linux系统电源管理相关的内容请看&#xff1a;Linux电源管理、功耗管理 和 发热管理 (CPUFreq、CPUIdle、RPM、thermal、睡眠 和 唤醒)-CSDN博客 本文主要基于linux-5.4.18版本的内核代码进行分析。 1 简介 1.1 硬件知识 CPU等芯片在工作时会产生大量热量&#xff0c;…...

【C++11】异常

前言 上文我们学习到了C11中类的新功能【C11】类的新功能-CSDN博客 本文我们来学习C下一个新语法&#xff1a;异常 1.异常的概念 异常的处理机制允许程序在运行时就出现的问题进行相应的处理。异常可以使得我们将问题的发现和问题的解决分开&#xff0c;程序的一部分负…...

C#WPF里不能出现滚动条的原因

使用下面这段代码,就不能出现滚动条: <mdix:DrawerHost.LeftDrawerContent><Grid Width="260" Background="{StaticResource MaterialDesign.Brush.Primary}"><Grid.RowDefinitions><RowDefinition Height="auto"/>&l…...

安装Hadoop并运行WordCount程序

一、安装 Java Hadoop 依赖 Java&#xff0c;首先需要安装 Java 开发工具包&#xff08;JDK&#xff09;。以 Ubuntu 为例&#xff1a; bash sudo apt update sudo apt install openjdk-8-jdk安装后&#xff0c;设置环境变量&#xff1a; bash echo export JAVA_HOME/usr/li…...

从零搭建AI工作站:Gemma3大模型本地部署+WebUI配置全套方案

文章目录 前言1. 安装Ollama2.Gemma3模型安装与运行3. 安装Open WebUI图形化界面3.1 Open WebUI安装运行3.2 添加模型3.3 多模态测试 4. 安装内网穿透工具5. 配置固定公网地址总结 前言 如今各家的AI大模型厮杀得如火如荼&#xff0c;每天都有新的突破。今天我要给大家安利一款…...

《数字人技术实现路径深度剖析与研究报告》

《数字人技术实现路径深度剖析与研究报告》 一、引言 1.1 研究背景与意义 近年来,随着人工智能、虚拟现实、计算机图形学等技术的飞速发展,数字人技术应运而生并取得了显著进展。数字人作为一种新兴的技术应用,正逐步渗透到各个领域,成为推动行业创新发展的重要力量。从最…...

《棒球百科》MLB棒球公益课·棒球1号位

MLB&#xff08;美国职业棒球大联盟&#xff09;的棒球公益课通过推广棒球运动、普及体育教育&#xff0c;对全球多个地区产生了多层次的影响&#xff1a; 1. 体育文化推广 非传统棒球地区的普及&#xff1a;在棒球基础较弱的地区&#xff08;如中国、欧洲部分国家&#xff09…...

Android 中 Handler (创建时)内存泄漏问题及解决方案

一、Handler 内存泄漏核心原理 真题 1&#xff1a;分析 Handler 内存泄漏场景 题目描述&#xff1a; 在 Activity 中使用非静态内部类 Handler 发送延迟消息&#xff0c;旋转屏幕后 Activity 无法释放&#xff0c;分析原因并给出解决方案。 内存泄漏链路分析&#xff1a; 引…...

linux-驱动开发之设备树详解(RK平台为例)

前言 Linux3.x以后的版本才引入了设备树&#xff0c;设备树用于描述一个硬件平台的板级细节。 在早些的linux内核&#xff0c;这些“硬件平台的板级细节”保存在linux内核目录“/arch”&#xff0c; 以ARM为例“硬件平台的板级细节”保存在“/arch/arm/plat-xxx”和“/arch/ar…...

【现代深度学习技术】注意力机制05:多头注意力

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

RDD的五大特征

1. 由多个分区&#xff08;Partitions&#xff09;组成 特性&#xff1a;RDD 是分区的集合&#xff0c;每个分区在集群的不同节点上存储。分区是数据并行处理的基本单位。作用&#xff1a;分区使 RDD 能够在集群中并行计算&#xff0c;提高处理效率。 2. 有一个计算每个分区的…...

键盘RGB矩阵与LED指示灯(理论部分)

键盘RGB矩阵与LED指示灯(理论部分) 一、LED指示灯基础 在键盘世界里,LED指示灯不仅仅是装饰,它们还能提供丰富的状态信息。QMK固件提供了读取HID规范中定义的5种LED状态的方法: Num Lock(数字锁定)Caps Lock(大写锁定)Scroll Lock(滚动锁定)Compose(组合键)Desp…...

HTTP方法和状态码(Status Code)

HTTP方法 HTTP方法&#xff08;也称HTTP动词&#xff09;主要用于定义对资源的操作类型。根据HTTP/1.1规范&#xff08;RFC 7231&#xff09;以及后续扩展&#xff0c;常用的HTTP方法有以下几种&#xff1a; GET&#xff1a;请求获取指定资源的表示形式。POST&#xff1a;向指…...

【sqlmap需要掌握的参数】

sqlmap需要掌握的参数 目标-u 指定URL 用于get请求-l 用于post请求- r 用于post请求指定数据库/表/字段 -D/-T/-C 脱库获得数据库获取用户获取表获取列获取字段获取字段类型获取值 其他 目标 -u 指定URL 用于get请求 -u URL, --urlURL 目标URL 只使用于get命令中 -l 用于pos…...

用 AltSnap 解锁 Windows 窗口管理的“魔法”

你有没有遇到过这样的场景&#xff1a;电脑屏幕上堆满了窗口&#xff0c;想快速调整它们的大小和位置&#xff0c;却只能拖来拖去&#xff0c;费时又费力&#xff1f;或者你是个多任务狂魔&#xff0c;喜欢一边写代码、一边看文档、一边刷视频&#xff0c;却发现 Windows 自带的…...

高并发内存池(三):TLS无锁访问以及Central Cache结构设计

目录 前言&#xff1a; 一&#xff0c;thread cache线程局部存储的实现 问题引入 概念说明 基本使用 thread cache TLS的实现 二&#xff0c;Central Cache整体的结构框架 大致结构 span结构 span结构的实现 三&#xff0c;Central Cache大致结构的实现 单例模式 thr…...

数据治理域——数据治理体系建设

摘要 本文主要介绍了数据治理系统的建设。数据治理对企业至关重要&#xff0c;其动因包括应对数据爆炸增长、提升内部管理效率、支撑复杂业务需求、加强风险防控与合规管理以及实现数字化转型战略。其核心目的是提升数据质量、统一数据标准、优化数据资产管理、支撑业务发展和…...

数据库实验报告 SQL SERVER 2008的基本操作 1

实验报告&#xff08;第 1 次&#xff09; 实验名称 SQL SERVER 2008的基本操作 实验时间 9月14日1-2节 一、实验内容 数据库的基本操作:包括创建、修改、附加、分离和删除数据库等。 二、源程序及主要算法说明 本次实验不涉及程序和算法。 三、测…...

基于STM32、HAL库的ICP-20100气压传感器 驱动程序设计

一、简介: ICP-20100 是 InvenSense(TDK 集团旗下公司)生产的一款高精度数字气压传感器,专为需要精确测量气压和海拔高度的应用场景设计。它具有低功耗、高精度、快速响应等特点,非常适合物联网、可穿戴设备和无人机等应用。 二、硬件接口: ICP-20100 引脚STM32L4XX 引脚…...

提示工程实战指南:Google白皮书关键内容一文讲清

You don’t need to be a data scientist or a machine learning engineer – everyone can writea prompt. 一、概述 Google于2025年2月发布的《Prompt Engineering》白皮书系统阐述了提示工程的核心技术、实践方法及挑战应对策略。该文档由Lee Boonstra主编&#xff0c;多位…...

国产大模型「五强争霸」:决战AGI,谁主沉浮?

引言 中国AI大模型市场正经历一场史无前例的洗牌&#xff01;曾经“百模混战”的局面已落幕&#xff0c;字节、阿里、阶跃星辰、智谱和DeepSeek五大巨头强势崛起&#xff0c;形成“基模五强”新格局。这场竞争不仅是技术实力的较量&#xff0c;更是资源、人才与生态的全面博弈。…...

Linux进程10-有名管道概述、创建、读写操作、两个管道进程间通信、读写规律(只读、只写、读写区别)、设置阻塞/非阻塞

目录 1.有名管道 1.1概述 1.2与无名管道的差异 2.有名管道的创建 2.1 直接用shell命令创建有名管道 2.2使用mkfifo函数创建有名管道 3.有名管道读写操作 3.1单次读写 3.2多次读写 4.有名管道进程间通信 4.1回合制通信 4.2父子进程通信 5.有名管道读写规律&#xff…...

高吞吐与低延迟的博弈:Kafka与RabbitMQ数据管道实战指南

摘要 本文全面对比Apache Kafka与RabbitMQ在数据管道中的设计哲学、核心差异及协同方案。结合性能指标、应用场景和企业级实战案例&#xff0c;揭示Kafka在高吞吐流式处理中的优势与RabbitMQ在复杂路由和低延迟传输方面的独特特点&#xff1b;介绍了使用Java生态成熟第三方库&…...

C++23 views::slide (P2442R1) 深入解析

文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::slide 概述基本概念原型定义辅助概念工作原理代码示例输出结果 views::slide 的应用场景计算移动平均值查找连续的子序列 总结 引言 在C的发展历程中&#xff0c;每一个新版本都会带来一系列令人期待的新特…...

SpringDataRedis的入门案例,以及RedisTemplate序列化实现

目录 SpringDataRedis 简单介绍 入门案例 RedisTemplate序列化方案 方案一: 方案二: SpringDataRedis 简单介绍 提供了对不同Redis客户端的整合(Lettuce和Jedis) 提供了RedisTemplate统一API来操作Redis 支持Redis的发布订阅模型 支持Redis哨兵和Redis集群 支持基于…...

鸿蒙HarmonyOS list优化一: list 结合 lazyforeach用法

list列表是开发中不可获取的&#xff0c;非常常用的组件&#xff0c;使用过程中会需要不断的优化&#xff0c;接下来我会用几篇文章进行list在纯原生的纯血鸿蒙的不断优化。我想进大厂&#xff0c;希望某位大厂的看到后能给次机会。 首先了解一下lazyforeach&#xff1a; Laz…...

【Jenkins简单自动化部署案例:基于Docker和Harbor的自动化部署流程记录】

摘要 本文记录了作者使用Jenkins时搭建的一个简单自动化部署案例&#xff0c;涵盖Jenkins的Docker化安装、Harbor私有仓库配置、Ansible远程部署等核心步骤。通过一个SpringBoot项目 (RuoYi) 的完整流程演示&#xff0c;从代码提交到镜像构建、推送、滚动更新&#xff0c;逐步实…...

【愚公系列】《Manus极简入门》034-跨文化交流顾问:“文化桥梁使者”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…...

数字滤波器应用介绍

此示例说明如何设计、分析数字过滤器并将其应用于数据。它将帮助您回答以下问题: 如何补偿滤波器引入的延迟?如何避免使信号失真?如何从信号中删除不需要的内容?如何微分信号?以及积分信号文章目录 补偿筛选引入的延迟补偿恒定滤波器延迟 如FIR引起的消除方法,末尾添零补…...

木马查杀篇—Opcode提取

【前言】 介绍Opcode的提取方法&#xff0c;并探讨多种机器学习算法在Webshell检测中的应用&#xff0c;理解如何在实际项目中应用Opcode进行高效的Webshell检测。 Ⅰ 基本概念 Opcode&#xff1a;计算机指令的一部分&#xff0c;也叫字节码&#xff0c;一个php文件可以抽取出…...

栈和队列复习(C语言版)

目录 一.栈的概念 二.栈的实现 三.队列的概念 四.队列的实现 五.循环队列的实现 一.栈的概念 可以将栈抽象地理解成羽毛球桶&#xff0c;或者理解成坐直升电梯&#xff1b;最后一个进去的&#xff0c;出来时第一个出来&#xff0c;并且只有一个出入口。这边需要注意的是&am…...

SDK does not contain ‘libarclite‘ at the path

Xcode16以上版本更新SDK之后就报错了。是因为缺少libarclite_iphoneos.a文件。所以需要在网上找一下该文件根据路径添加进去&#xff0c;arc文件可能需要新建一下。 clang: error: SDK does not contain ‘libarclite’ at the path ‘/Applications/Xcode.app/Contents/Develo…...

Kotlin跨平台Compose Multiplatform实战指南

Kotlin Multiplatform&#xff08;KMP&#xff09;结合 Compose Multiplatform 正在成为跨平台开发的热门选择&#xff0c;它允许开发者用一套代码构建 Android、iOS、桌面&#xff08;Windows/macOS/Linux&#xff09;和 Web 应用。以下是一个实战指南&#xff0c;涵盖核心概念…...

Oracle数据库全局性HANG的处理过程

如果Oracle数据库全局性HANG&#xff0c;首先要做的就是收集数据库HANG时的状态&#xff0c;只有收集到了相应状态&#xff0c;抓住故障现场&#xff0c;才可以进一步分析故障产生的可能原因。 出现此故障&#xff0c;一般情况下可以如此处理&#xff1a; 如果数据库是单节点&a…...

MySQL 8.0 OCP(1Z0-908)英文题库(21-30)

目录 第21题题目分析正确答案 第22题题目分析正确答案 第23题题目分析正确答案 第24题题目分析正确答案 第25题题目分析正确答案 第26题题目分析正确答案 第27题题目分析正确答案 第28题题目分析正确答案 第29题题目分析正确答案 第30题题目解析正确答案 第21题 Choose three.…...

beyond compare 免密钥进入使用(删除注册表)

beyond compare 免密钥进入&#xff0c;免费使用&#xff08;删除注册表&#xff09; 温馨提醒&#xff1a;建议仅个人使用&#xff0c;公司使用小心律师函警告&#xff01; 1.winr 输入regedit 打开注册表 2.删除计算机 \HKEY_CURRENT_USER\Software\Scooter Software\Beyo…...

前端项目2-01:个人简介页面

目录 一.代码显示 二.效果图 三.代码分析 1. 文档声明和 HTML 基本结构 2. CSS 样式部分 全局样式 body 样式 页面主要容器 box 样式 左侧区域 l 样式 右侧区域 r 样式 左侧区域中头像容器 to 样式 头像图片样式及悬停效果 左侧区域中个人信息容器 tit 样式 个人…...

.NET 8 API 实现websocket,并在前端angular实现调用

.NET 8 API 实现websocket&#xff0c;并在前端angular实现调用。 后端&#xff1a;.NET 8 WebSocket API 实现 在 .NET 8 中&#xff0c;可以通过 Microsoft.AspNetCore.WebSockets 提供的支持来实现 WebSocket 功能。以下是创建一个简单的 WebSocket 控制器的步骤。 安装必…...

P2P架构

P2P 是 Peer-to-Peer&#xff08;点对点&#xff09; 的缩写&#xff0c;是一种 去中心化 的网络架构&#xff0c;其中每个节点&#xff08;称为 “对等节点”&#xff0c;Peer&#xff09;既是 “客户端”&#xff0c;也是 “服务器”&#xff0c;可以直接与其他节点通信、共享…...

菊厂0510面试手撕题目解答

题目 输入一个整数数组&#xff0c;返回该数组中最小差出现的次数。 示例1&#xff1a;输入&#xff1a;[1,3,7,5,9,12]&#xff0c;输出&#xff1a;4&#xff0c;最小差为2&#xff0c;共出现4次&#xff1b; 示例2&#xff1a;输入&#xff1a;[90,98,90,90,1,1]&#xf…...

【25软考网工】第六章(4)VPN虚拟专用网 L2TP、PPTP、PPP认证方式;IPSec、GRE

博客主页&#xff1a;christine-rr-CSDN博客 ​专栏主页&#xff1a;软考中级网络工程师笔记 ​​ 大家好&#xff0c;我是christine-rr !目前《软考中级网络工程师》专栏已经更新二十多篇文章了&#xff0c;每篇笔记都包含详细的知识点&#xff0c;希望能帮助到你&#xff01…...

C语言:深入理解指针(3)

目录 一、数组名的理解 二、用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 八、结语 一、数组名的理解 数组名其实就是首元素的地址 int arr[3] {1,2,3}; printf("arr :%p\n" ,arr); printf(…...

R语言实战第5章(1)

第一部分&#xff1a;数学、统计和字符处理函数 数学和统计函数&#xff1a;R提供了丰富的数学和统计函数&#xff0c;用于执行各种计算和分析。这些函数可以帮助用户快速完成复杂的数学运算、统计分析等任务&#xff0c;例如计算均值、方差、相关系数、进行假设检验等。字符处…...

Lodash isEqual 方法源码实现分析

Lodash isEqual 方法源码实现分析 Lodash 的 isEqual 方法用于执行两个值的深度比较&#xff0c;以确定它们是否相等。这个方法能够处理各种 JavaScript 数据类型&#xff0c;包括基本类型、对象、数组、正则表达式、日期对象等&#xff0c;并且能够正确处理循环引用。 1. is…...

探索边缘计算:赋能物联网的未来

摘要 随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;越来越多的设备接入网络&#xff0c;产生了海量的数据。传统的云计算模式在处理这些数据时面临着延迟高、带宽不足等问题&#xff0c;而边缘计算的出现为解决这些问题提供了新的思路。本文将深入探讨边缘…...

Ubuntu中配置【Rust 镜像源】

本篇主要记录Ubuntu中配置Rust编程环境时&#xff0c;所需要做的镜像源相关的配置 无法下载 Rust 工具链 通过环境变量指定 Rust 的国内镜像源&#xff08;如中科大或清华源&#xff09;。 方法一&#xff1a;临时设置镜像 export RUSTUP_DIST_SERVERhttps://mirrors.ustc.e…...

netty 客户端发送消息服务端收到消息无法打印,springBoot配合 lombok使用@Slf4j

netty 客户端发送消息服务端收到消息无法打印&#xff0c;springBoot配合 lombok使用Slf4j 服务端代码 Slf4j public class EventLoopServer {public static void main(String[] args) throws InterruptedException {new ServerBootstrap().group(new NioEventLoopGroup()).c…...

学习笔记:黑马程序员JavaWeb开发教程(2025.4.3)

12.1 基础登录功能 EmpService中的login方法&#xff0c;是根据接收到的用户名和密码&#xff0c;查询时emp数据库中的员工信息&#xff0c;会返回一个员工对象。使用了三元运算符来写返回 Login是登录&#xff0c;是一个业务方法&#xff0c;mapper接口是持久层&#xff0c;是…...

Spark SQL 运行架构详解(专业解释+番茄炒蛋例子解读)

1. 整体架构概览 Spark SQL的运行过程可以想象成一个"SQL查询的加工流水线"&#xff0c;从原始SQL语句开始&#xff0c;经过多个阶段的处理和优化&#xff0c;最终变成分布式计算任务执行。主要流程如下&#xff1a; SQL Query → 解析 → 逻辑计划 → 优化 → 物理…...