菌群数据预处理-microbiome包

使用phyloseq软件包中的工具以及microbiome软件包中的某些扩展来操作微生物组数据集的说明,包括子集,聚合和过滤。

加载数据

library(phyloseq)
library(microbiome)
library(knitr)
data(atlas1006)   
# Rename the example data (which is a phyloseq object)
pseq <- atlas1006

总结phyloseq对象的内容

summarize_phyloseq(pseq)
## Compositional = NO2
## 1] Min. number of reads = 19002] Max. number of reads = 288833] Total number of reads = 135465644] Average number of reads = 11769.38662033015] Median number of reads = 111717] Sparsity = 0.2090022054400866] Any OTU sum to 1 or less? NO8] Number of singletons = 09] Percent of OTUs that are singletons 
##         (i.e. exactly one read detected across all samples)010] Number of sample variables are: 10agesexnationalityDNA_extraction_methodprojectdiversitybmi_groupsubjecttimesample2
## [[1]]
## [1] "1] Min. number of reads = 1900"
## 
## [[2]]
## [1] "2] Max. number of reads = 28883"
## 
## [[3]]
## [1] "3] Total number of reads = 13546564"
## 
## [[4]]
## [1] "4] Average number of reads = 11769.3866203301"
## 
## [[5]]
## [1] "5] Median number of reads = 11171"
## 
## [[6]]
## [1] "7] Sparsity = 0.209002205440086"
## 
## [[7]]
## [1] "6] Any OTU sum to 1 or less? NO"
## 
## [[8]]
## [1] "8] Number of singletons = 0"
## 
## [[9]]
## [1] "9] Percent of OTUs that are singletons \n        (i.e. exactly one read detected across all samples)0"
## 
## [[10]]
## [1] "10] Number of sample variables are: 10"
## 
## [[11]]
##  [1] "age"                   "sex"                   "nationality"          
##  [4] "DNA_extraction_method" "project"               "diversity"            
##  [7] "bmi_group"             "subject"               "time"                 
## [10] "sample"

从phyloseq对象中检索数据元素

phyloseq对象包含OTU表(分类群丰度)、样本元数据、分类表(OTU和更高级别的分类群之间的映射)和系统发育树(分类群之间的关系)。其中一些是可选的。

选择元数据

meta <- meta(pseq)

物种组成数据

taxonomy <- tax_table(pseq)

分类组的丰度("OTU表")为TaxaxSamples矩阵。

# Absolute abundances
otu.absolute <- abundances(pseq)

# Relative abundances
otu.relative <- abundances(pseq, "compositional")

总counts

reads_sample <- readcount(pseq)
# check for first 5 samples
reads_sample[1:5]
## Sample-1 Sample-2 Sample-3 Sample-4 Sample-5 
##     7593    10148     7131    10855    12000

在phyloseq对象元数据中增加每个样本的reads。

sample_data(pseq)$reads_sample <- reads_sample

# reads_sample is add to the last column in sample_data of pseq object.
head(meta(pseq)[,c("sample", "reads_sample")])
##            sample reads_sample
## Sample-1 Sample-1         7593
## Sample-2 Sample-2        10148
## Sample-3 Sample-3         7131
## Sample-4 Sample-4        10855
## Sample-5 Sample-5        12000
## Sample-6 Sample-6         7914

Melting phyloseq数据,以便绘图

df <- psmelt(pseq)
kable(head(df))
OTUSampleAbundanceagesexnationalityDNA_extraction_methodprojectdiversitybmi_groupsubjecttimesamplereads_samplePhylumFamilyGenus
110989Prevotella melaninogenica et rel.Sample-4481496154femaleCentralEuropeo185.98lean4480Sample-44826546BacteroidetesBacteroidetesPrevotella melaninogenica et rel.
111380Prevotella melaninogenica et rel.Sample-3601429645femaleCentralEuropeo135.49severeobese3600Sample-36021086BacteroidetesBacteroidetesPrevotella melaninogenica et rel.
111232Prevotella melaninogenica et rel.Sample-1901367634femaleCentralEuroper76.06lean1900Sample-19023954BacteroidetesBacteroidetesPrevotella melaninogenica et rel.
111553Prevotella melaninogenica et rel.Sample-7431350952maleUSNA195.21obese7430Sample-74320632BacteroidetesBacteroidetesPrevotella melaninogenica et rel.
110590Prevotella melaninogenica et rel.Sample-3661349052femaleCentralEuropeo155.63obese3660Sample-36619651BacteroidetesBacteroidetesPrevotella melaninogenica et rel.
111029Prevotella melaninogenica et rel.Sample-3751338445femaleCentralEuropeo165.64severeobese3750Sample-37521408BacteroidetesBacteroidetesPrevotella melaninogenica et rel.

Sample operations

Sample names and variables

head(sample_names(pseq))
## [1] "Sample-1" "Sample-2" "Sample-3" "Sample-4" "Sample-5" "Sample-6"

Total OTU abundance in each sample

s <- sample_sums(pseq)

Abundance of a given species in each sample

head(abundances(pseq)["Akkermansia",])
## Sample-1 Sample-2 Sample-3 Sample-4 Sample-5 Sample-6 
##       21       36      475       61       34       14

Select a subset by metadata fields:

pseq.subset <- subset_samples(pseq, nationality == "AFR")

Select a subset by providing sample names:

# Check sample names for African Females in this phyloseq object
s <- rownames(subset(meta(pseq), nationality == "AFR" & sex == "Female"))

# Pick the phyloseq subset with these sample names
pseq.subset2 <- prune_samples(s, pseq)

Pick samples at the baseline time points only:

pseq0 <- baseline(pseq)

数据转换

微生物组包为标准样本/OTU转换提供了一个封装器。对于任意的转换,请使用phyloseq包中的transform_sample_counts函数。如果数据包含零,则Log10转换为log(1+x)。另外 "Z"、"clr"、"hellinger "和 "shift "也可作为常用的变换。相对丰度(注意,输入的数据需要是绝对尺度,而不是对数!)。

pseq.compositional <- microbiome::transform(pseq, "compositional")

CLR("clr")转换也是可用的,它带有一个伪计数以避免零的出现。另一种方法是对零膨胀的未观察到的数值进行估算。有时会使用乘法Kaplan-Meier平滑样条(KMSS)替代,乘法lognormal替代,或乘法简单替代。这些都可以在zCompositions R包中找到(分别是函数multKM、multLN和multRepl)。在实践中至少要使用n.draws=1000,这里为了加快例子的速度而少用。

data(dietswap)
x <- dietswap
# Compositional data 
x2 <- microbiome::transform(x, "compositional")

变量操作

变量名称

sample_variables(pseq)
##  [1] "age"                   "sex"                   "nationality"          
##  [4] "DNA_extraction_method" "project"               "diversity"            
##  [7] "bmi_group"             "subject"               "time"                 
## [10] "sample"                "reads_sample"

选择特定变量

head(get_variable(pseq, sample_variables(pseq)[1]))
## [1] 28 24 52 22 25 42

为元数据分配新字段

# Calculate diversity for samples
div <- microbiome::alpha(pseq, index = "shannon")

# Assign the estimated diversity to sample metadata
sample_data(pseq)$diversity <- div

物种分类操作

物种数目

n <- ntaxa(pseq)

丰度最高的物种

topx <- top_taxa(pseq, n = 10)

名称

ranks <- rank_names(pseq)  # Taxonomic levels
taxa  <- taxa(pseq)        # Taxa names at the analysed level

子集

pseq.bac <- subset_taxa(pseq, Phylum == "Bacteroidetes")

选择特定条件物种

# List of Genera in the Bacteroideted Phylum
taxa <- map_levels(NULL, "Phylum", "Genus", pseq)$Bacteroidetes

# With given taxon names
ex2 <- prune_taxa(taxa, pseq)

# Taxa with positive sum across samples
ex3 <- prune_taxa(taxa_sums(pseq) > 0, pseq)

通过用户指定的函数值(这里是方差)进行过滤。

f <- filter_taxa(pseq, function(x) var(x) > 1e-05, TRUE)

列出门水平物种。

head(get_taxa_unique(pseq, "Phylum"))
## [1] "Actinobacteria"  "Firmicutes"      "Proteobacteria"  "Verrucomicrobia"
## [5] "Bacteroidetes"   "Spirochaetes"

挑选特定样本的分类群丰度

samplename <- sample_names(pseq)[[1]]

# Pick abundances for a particular taxon
tax.abundances <- abundances(pseq)[, samplename]

合并操作

将分类群聚集到更高的分类级别。这在系统发育树缺失的情况下特别有用。( merge_samples, merge_taxa and tax_glom).

pseq2 <- aggregate_taxa(pseq, "Phylum") 

将所需的分类群合并到 "其他 "类别。在这里,我们将所有的Bacteroides组合并为一个名为Bacteroides的单一组。

pseq2 <- merge_taxa2(pseq, pattern = "^Bacteroides", name = "Bacteroides") 

将phyloseq对象与phyloseq包合并

merge_phyloseq(pseqA, pseqB)

在一个数据框架中连接otu/asv表和分类法

library(dplyr) 
library(microbiome)
data("atlas1006") # example data from microbiome pkg
x <-atlas1006

asv_tab <- as.data.frame(abundances(x)) # get asvs/otus
asv_tab$asv_id <- rownames(asv_tab) # add a new column for ids
#tax_tab <- as.data.frame(tax_table(x)) # get taxonomy note: can be slow
tax_tab <- as(x@tax_table,"matrix") # get taxonomy note as matrix
tax_tab <- as.data.frame(tax_tab) # convert to data frame
tax_tab$asv_id <- rownames(tax_tab) # add a new column for ids
asv_tax_tab <- tax_tab %>% 
  left_join(asv_tab, by="asv_id") # join to get taxonomy and asv table

head(asv_tax_tab)[,1:8]
##            Phylum          Family                        Genus
## 1  Actinobacteria  Actinobacteria             Actinomycetaceae
## 2      Firmicutes         Bacilli                   Aerococcus
## 3  Proteobacteria  Proteobacteria                    Aeromonas
## 4 Verrucomicrobia Verrucomicrobia                  Akkermansia
## 5  Proteobacteria  Proteobacteria Alcaligenes faecalis et rel.
## 6   Bacteroidetes   Bacteroidetes           Allistipes et rel.
##                         asv_id Sample-1 Sample-2 Sample-3 Sample-4
## 1             Actinomycetaceae        0        0        0        0
## 2                   Aerococcus        0        0        0        0
## 3                    Aeromonas        0        0        0        0
## 4                  Akkermansia       21       36      475       61
## 5 Alcaligenes faecalis et rel.        1        1        1        2
## 6           Allistipes et rel.       72      127       34      344

抽平

pseq.rarified <- rarefy_even_depth(pseq)

物种分类

在分类级别之间进行转换(这里从属(Akkermansia)到门(Verrucomicrobia)。

m <- map_levels("Akkermansia", "Genus", "Phylum", tax_table(pseq))
print(m)
## [1] "Verrucomicrobia"

元数据

可视化给定因素(性别)水平在指定组(组)内的频率。

p <- plot_frequencies(sample_data(pseq), "bmi_group", "sex")
print(p)

# Retrieving the actual data values:
# kable(head(p@data), digits = 2)

提供自定义功能,将年龄或BMI信息切割成离散的类别。

group_bmi(c(22, 28, 31), "standard")
## [1] lean       overweight obese     
## Levels: underweight lean overweight obese severe morbid super
group_age(c(17, 41, 102), "decades")
## [1] [10,20)   [40,50)   [100,110]
## 10 Levels: [10,20) [20,30) [30,40) [40,50) [50,60) [60,70) [70,80) ... [100,110]

向phyloseq对象添加元数据。为了可重复性,我们在这个例子中只是使用了现有的元数据,但这可以用另一个data.frame(样本x字段)来代替。

# Example data
data(dietswap)
pseq <- dietswap

# Pick the existing metadata from a phyloseq object
# (or retrieve this from another source)
df <- meta(pseq)

# Merge the metadata back in the phyloseq object
pseq2 <- merge_phyloseq(pseq, sample_data(df))

https://microbiome.github.io/tutorials/Preprocessing.html

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
### 回答1: 很抱歉,我不是一个能够演示代码的 AI,但我可以向您提供 phyloseq 在 R 语言中的使用方法。首先需要安装 R 语言和 phyloseq ,然后使用以下代码进行导入: ``` library(phyloseq) # 导入 OTU 表 otu_table <- read.table("otu_table.txt", header=T, row.names=1, sep="\t") otu_table <- as.matrix(otu_table) # 导入分类信息表 tax_table <- read.table("taxonomy_table.txt", header=T, row.names=1, sep="\t") tax_table <- as.matrix(tax_table) # 导入样品元数据表 sample_data <- read.table("sample_data.txt", header=T, row.names=1, sep="\t") sample_data <- as.data.frame(sample_data) # 根据导入的数据构建 phyloseq 对象 physeq <- phyloseq(otu_table, tax_table, sample_data) # 对 phyloseq 对象进行各种分析 ``` 上述代码中,otu_table.txt, taxonomy_table.txt 和 sample_data.txt 分别为 OTU 表、分类信息表和样品元数据表。使用上述代码时,需要将这三个表格的路径替换为你自己的路径,才能成功导入。 ### 回答2: phyloseq是一个用于处理、分析和可视化宏基因组学数据的R。它提供了一套强大的工具,用于在生态学研究中探索和数据挖掘微生物群落。 首先,我们需要安装并加载phyloseq: ```R install.packages("phyloseq") library(phyloseq) ``` 然后,我们需要导入微生物数据并创建一个phyloseq对象。数据可以是OTU表和相应的分类信息。我们使用`otu_table()`函数和`tax_table()`函数分别导入OTU表和分类信息: ```R # 导入OTU表 otu_data <- read.table("otu_table.txt", header=TRUE, row.names=1, sep="\t") otu_table <- otu_table(otu_data, taxa_are_rows=FALSE) # 导入分类信息 taxonomy_data <- read.table("taxonomy.txt", header=TRUE, row.names=1, sep="\t") tax_table <- tax_table(taxonomy_data) ``` 接下来,我们可以将OTU表和分类信息合并为一个phyloseq对象: ```R # 创建phyloseq对象 physeq <- phyloseq(otu_table, tax_table) ``` 下一步是对数据进行过滤和归一化。我们可以使用`filter_taxa()`函数过滤低丰度的OTU,使用`filter_sample()`函数过滤低读数的样本,使用`transform_sample_counts()`函数对数据进行归一化(例如,可以使用样本总数归一化): ```R # 过滤低丰度的OTU physeq <- filter_taxa(physeq, function(x) sum(x > 0) > 5) # 过滤低读数的样本 physeq <- filter_samples(physeq, function(x) sum(x) > 1000) # 对数据进行样本总数归一化 physeq <- transform_sample_counts(physeq, function(x) x/sum(x)) ``` 接下来,我们可以进行多样性分析。可以使用`estimate_richness()`函数计算物种丰富度指数,使用`plot_richness()`函数可视化物种丰富度: ```R # 计算物种丰富度指数 richness_data <- estimate_richness(physeq) # 可视化物种丰富度 plot_richness(richness_data) ``` 此外,我们还可以进行群落结构分析,例如使用NMDS(非度量多维尺度)图表征样本之间的相似性: ```R # 计算样本之间的相似性 distance <- phyloseq::distance(physeq, method="bray") # 进行NMDS分析并可视化结果 nmds <- ordinate(physeq, method="NMDS", distance=distance) plot_ordination(physeq, nmds) ``` 除了上述分析方法之外,phyloseq还提供了许多其他功能,如物种分类树分析、差异分析和功能预测等。需要根据实际需要选择合适的方法和函数。 以上是对phyloseq分析代码的一些基本介绍,希望能对你有所帮助。使用phyloseq可以轻松地进行微生物群落分析和可视化,从而更好地理解和解释生态系统中微生物的角色和功能。 ### 回答3: phyloseq是一个在R语言环境下的生物信息学分析,用于分析和可视化微生物组学数据。它提供了一种整合和管理多种数据类型的方法,括OTU表、样本数据、分类注释和生物学元数据等。下面是一个简单的phyloseq分析代码示例。 第一步是安装和加载phyloseq: ``` install.packages("phyloseq") library(phyloseq) ``` 第二步是准备数据。首先,我们需要创建OTU表,它是一个由样本和OTU组成的矩阵。可以使用`otu_table()`函数创建OTU表。然后,我们需要创建样本数据,它含关于每个样本的信息。可以使用`sample_data()`函数创建样本数据。最后,我们还可以添加分类注释和生物学元数据等信息到phyloseq对象中。例如,可以使用`tax_table()`函数添加分类学注释。 第三步是创建phyloseq对象。使用`phyloseq()`函数将OTU表、样本数据和其他注释信息整合成一个phyloseq对象。例如: ``` my_phyloseq <- phyloseq(otu_table, sample_data, tax_table) ``` 第四步是进行一些基本的分析。phyloseq提供了许多用于数据分析的函数。例如,可以使用`plot_bar()`函数绘制样本间微生物组成的条形图,使用`plot_tree()`函数绘制系统发育树等。 第五步是进行更复杂的分析。phyloseq还提供了一些高级分析方法,如计算OTU的丰度、物种多样性、样品相似性等。例如,可以使用`estimate_richness()`函数计算物种丰度,使用`plot_heatmap()`函数绘制OTU热图等。 最后,可以使用phyloseq中的可视化函数对分析结果进行可视化。可以使用`plot_network()`函数绘制微生物组网络图,使用`plot_ordination()`函数进行PCA分析等。 总而言之,phyloseq是一个功能强大的,用于整合、管理和分析微生物组学数据。它提供了许多方便的函数和方法,帮助我们更好地理解和解释微生物组的复杂性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值