【编程语言入门】R


前言

本学期学习R语言来做数据可视化,记录学习内容方便回顾。
所用软件:R和Rstudio。
另:本人所用电脑为MacBook,涉及按键部分均为MacBook键盘。

持续更新中——


一、基础操作

1.新建文件

点击左上角加号。

2.添加/取消注释

在前面加#或快捷键:command+shift+c。

3.运行程序

运行整段:command+shift+enter
运行单行:command+enter

4.获取/设置工作目录

获取:getwd(),得到当前.R文件的路径
设置:setwd(),设置当前.R文件的路径,括号中要写目标地址

注意:设置时使用单斜杠/

5.赋值

除了=,还可以用->或<-来赋值,箭头指向变量。

6.显示变量

方法一:直接在命令行输入变量名称后按回车;
方法二:使用print()函数。

7.查看/清除变量

·ls():查看所有已经定义的变量,并输出变量名称。
·rm(a):清除名称为a的变量。
·rm(list=ls()):清除所有变量。

8.函数帮助

方法一:输入?+要查询的函数;
方法二:help(函数名称);
方法三:example(函数名称);
会在右下角的框中显示该函数的使用方法。

9.安装R包

使用install.packages()安装,用library()调用。

注意:前者要加双引号,后者不用。

二、函数

1.文件读取

(1)scan函数

scan(file=" ",what=double( ),nmax=-1,n=-1,sep=" ")
  1. file后填写文件名或路径,不填默认从键盘读取;
  2. what表示读取的数据类型,如果有多个可以不填;
  3. nmax表示最大读取数据点数,默认值-1表示读取所有数据点;
  4. n表示要读取的数据点数,默认值-1表示读取所有数据点(注意n和nmax写一个就可以);
  5. sep表示数据之间的分隔符,默认为空格。

(2)readline()函数
从键盘中读入数据。

(3)readxlsx()函数
读入.xlsx文件,需要安装r包openxlsx

2.读入数据

(1)键盘输入

> G<-matrix(numeric(0),5,4)
> G<-edit(G)

出现以下框框,修改数据即可。
请添加图片描述

(2)从CSV文件或.data文件中读入:read.table

mydataframe<-read.table("statistic app/test.csv",sep=",")
data<-read.table("statistic app/iris.data",sep=",")

(3)从EXCEL中读入:read.xlsx

library(openxlsx)
data<-read.xlsx("statistic app/test Excel.xlsx",colNames=FALSE,rowNames=FALSE)
#colNames,rowNames如果为TRUE,则使用第一行和第一列作为行和列的标题

三、语法

请添加图片描述

1.向量

(1)创建

a<-c(1,2,3,4)
#a为(1,2,3,4)
a<-1:4
#a为(1,2,3,4)
a<-vector(length=4)
a[1]<-1
#a为(1,0,0,0)

(2)索引

a[2]#输出:2
a[c(1,3)]#输出:1 3
a[1:3]#输出:1 2 3

注意:r语言向量中第一个是从1开始标号的!

(3)更改
索引后用<-赋值。

(4)删除

e<-a[-2]
#此时e就是a中删除2的结果1,3,4

注意:删除后要重新赋给一个新变量!

(5)添加
定义一个新变量存放添加后的向量。

> a<-c(5,4,3,2,1)
> a
[1] 5 4 3 2 1
> b<-c(a[1:2],8,a[3:5])
> b
[1] 5 4 8 3 2 1

(6)获取长度
使用length()函数。

> x<-c(2,4,6,8)
> length(x)
[1] 4

(7)判断数据类型
使用class()函数。

> A<-1
> class(A)
[1] "numeric"
> B<-c(1,2,3)
> class(B)
[1] "numeric"#向量的类型和其中元素的类型相同
> C<-"flower"
> class(C)
[1] "character"#字符型加双引号
> D<-TRUE
> class(D)
[1] "logical"

(8)其他常用向量函数

> seq(from=3,to=12,by=3)#从3到12,输出差为3的等差数列
[1]  3  6  9 12
> seq(from=3,to=12,length.out=6)#从3到12,输出6个数且为等差数列
[1]  3.0  4.8  6.6  8.4 10.2 12.0
> rep(c(1,2),time=2)#整个向量重复两次
[1] 1 2 1 2
> rep(c(1,2),each=2)#每个元素重复两次
[1] 1 1 2 2
> y<-c(1,2,3,4,5,6)#cut(y,n)把连续型变量y划分为n个因子
> cut(y,3)
[1] (0.995,2.67] (0.995,2.67] (2.67,4.33]  (2.67,4.33]  (4.33,6]     (4.33,6]    
Levels: (0.995,2.67] (2.67,4.33] (4.33,6]
> name<-c("Jane")#连接函数cat
> cat("Hello",name,'\n')
Hello Jane 

2.矩阵

(1)创建

> matrix((1:20),nrow=5,ncol=4)#行数和个数固定,可以不用输入列数
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20
> matrix(1:20,nrow=5,ncol=4,byrow=TRUE)#byrow默认为FALSE,改为TRUE则按行排
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16
[5,]   17   18   19   20
> rnames<-c("r1","r2","r3")
> cnames<-c("c1","c2","c3")
> matrix(1:9,nrow=3,ncol=3,dimnames=list(rnames,cnames))#用list给行和列加名称
   c1 c2 c3
r1  1  4  7
r2  2  5  8
r3  3  6  9

注:也可以后加名称,用dimnames()函数设置即可,括号中为矩阵名称,所赋的值为list类型。

(2)索引

> M<-matrix(1:6,nrow=3,ncol=2)
> M
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> M[1,2]#第一行第二列
[1] 4
> M[,1]#第1列所有元素
[1] 1 2 3
> M[2,]#第2行所有元素
[1] 2 5

(3)矩阵的合并

> M<-matrix(1,2,3)#表示所有元素均为1
> N<-matrix(2,2,3)#所有元素均为2
> rbind(M,N)#纵向合并,即增加行数
     [,1] [,2] [,3]
[1,]    1    1    1
[2,]    1    1    1
[3,]    2    2    2
[4,]    2    2    2
> cbind(M,N)#横向合并,即增加列数
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    1    2    2    2
[2,]    1    1    1    2    2    2

(4)矩阵相关数学计算

> colSums(M) #对列求和
[1] 2 2 2
> rowSums(M) #对行求和
[1] 3 3
> colMeans(M) #对列求均值
[1] 1 1 1
> rowMeans(M) #对行求均值
[1] 1 1
> det(M)
> > X<-matrix(1,2,2) #计算行列式(只能对方阵)
> det(X)
[1] 0
> A<-matrix(1:4,nrow=2)
> A
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> A+A #对应分量相加
     [,1] [,2]
[1,]    2    6
[2,]    4    8
> A%*%A #矩阵相乘
     [,1] [,2]
[1,]    7   15
[2,]   10   22
> A*A #对应分量相乘
     [,1] [,2]
[1,]    1    9
[2,]    4   16
> diag(c(1,4)) #写成对角矩阵
     [,1] [,2]
[1,]    1    0
[2,]    0    4
> diag(diag(A))
     [,1] [,2]
[1,]    1    0
[2,]    0    4
> diag(A)#对角元素的向量
[1] 1 4
> c(A)#把矩阵写成向量的形式
[1] 1 2 3 4


> M<-matrix(1:6,nrow=3,ncol=2)
> dim(M)#求M维度
[1] 3 2
> dim(M)[1]#求M
[1] 3
> dim(M)[2]
[1] 2

3.数组

相当于高维矩阵

> array(1:24,c(2,3,4))#2行,3列,4维
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

4.数据框

列向量,每个列向量可以是不同的数据类型
(1)创建

> studentsID<-c(1,2,3)
> score<-c(99,89,93)
> level<-c("S","B","A")
> mydata<-data.frame(studentsID,score,level)
> mydata
  studentsID score level
1          1    99     S
2          2    89     B
3          3    93     A

(2)索引

> mydata[2]#可以用列数索引
  score
1    99
2    89
3    93
> mydata["level"]#也可以用名称索引
  level
1     S
2     B
3     A
> mydata[1,2]#和矩阵一样,表示第一行第二列的元素
[1] 99
> mydata[c(1,2)]#写成向量的形式就是这两列的内容
  studentsID score
1          1    99
2          2    89
3          3    93
> mydata[c(1,2),c(2,3)]#前面一个向量是行向量,后面一个向量是列向量
  score level
1    99     S
2    89     B

(3)合并

> studentsID<-c(1,2,3)
> score<-c(99,89,93)
> level<-c("excellent","middle","good")
> studentsdata1<-data.frame(studentsID,score,level)
> print(studentsdata1)
  studentsID score     level
1          1    99 excellent
2          2    89    middle
3          3    93      good
> studentsID<-c(1,2,4)
> report<-c("Yes","No","Yes")
> level<-c("good","middle","good")
> studentsdata2<-data.frame(studentsID,report,level)
> print(studentsdata2)
  studentsID report  level
1          1    Yes   good
2          2     No middle
3          4    Yes   good
> merge(studentsdata1,studentsdata2,by="studentsID")
> #显示两个数据框中相同的元素
  studentsID score   level.x report level.y
1          1    99 excellent    Yes    good
2          2    89    middle     No  middle
> merge(studentsdata1,studentsdata2,by="studentsID",all.x=T)
> #显示第一个数据框中所有元素
  studentsID score   level.x report level.y
1          1    99 excellent    Yes    good
2          2    89    middle     No  middle
3          3    93      good   <NA>    <NA>
> merge(studentsdata1,studentsdata2,by="studentsID",all=T)
> #显示两个数据框中所有元素
  studentsID score   level.x report level.y
1          1    99 excellent    Yes    good
2          2    89    middle     No  middle
3          3    93      good   <NA>    <NA>
4          4    NA      <NA>    Yes    good

(4)取子集

> studentdata1
  studentsID score     level
1          1    99 excellent
2          2    89    middle
3          3    93      good
> part1<-studentdata1[,c(2:3)]#提取2到3列
> part1
  score     level
1    99 excellent
2    89    middle
3    93      good
> part2<-studentdata1[c(1:2),]#提取1到2行
> part2
  studentsID score     level
1          1    99 excellent
2          2    89    middle
> newpart<-subset(studentdata1,score<95 & score>90,select = c(studentsID,score))
> newpart
  studentsID score
3          3    93

subset函数:第一个是数据框名称,第二个是条件,第三个是要保留的内容。

5.列表

其中的元素可以是任何数据结构

> g<-"mylist"
> h<-c(25,27,33,28)
> j<-matrix(1:10,nrow=5)
> k<-c("one","two","three")
> myList<-list(title=g,ages=h,j,k)#等号前面相当于小标题,没有就默认为项目排序
> myList
$title
[1] "mylist"

$ages
[1] 25 27 33 28

[[3]]
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

[[4]]
[1] "one"   "two"   "three"

6.因子

因子不是向量

> level<-factor(c("excellent","good","middle","good"))
> summary(level)
excellent      good    middle 
        1         2         1 

7.缺失值

> y<-c(1,2,NA,4,5)
> is.na(y)
[1] FALSE FALSE  TRUE FALSE FALSE
> sum(y,na.rm=TRUE)#增加条件:把缺失值移除
[1] 12
> z<-na.omit(y)
> print(z)
[1] 1 2 4 5
attr(,"na.action")
[1] 3
attr(,"class")
[1] "omit"

> B<-c(1,2,3,4,NA)
> B
[1]  1  2  3  4 NA
> mean(B)
[1] NA
> mean(B,na.rm=TRUE)
[1] 2.5

8.随机抽样

(1)数据的随机抽样

> A<-c(1:20)
> sample(A,5)#默认无放回
[1]  5 12 17 19 11
> sample(A,5,replace=TRUE)#TRUE表示有放回
[1] 17 18 17 16 17

(2)数据框的随机抽样

> studentsID<-c(1,2,3)
> score<-c(99,89,93)
> level<-c("excellent","middle","good")
> studentsdata<-data.frame(studentsID,score,level)
> studentsdata
  studentsID score     level
1          1    99 excellent
2          2    89    middle
3          3    93      good
> id<-sample(1:nrow(studentsdata),2)#从第一行到最后一行抽样两个
> id
[1] 3 1

(3)随机分布的随机抽样

#随机分布
> x<-pretty(c(-3:3),30)
> y<-dnorm(x)#d:density概率密度
> plot(x,y,type = 'l',xlab="Normal deviate",ylab="Density")
> y<-pnorm(x)#p:distribution function分布函数
> plot(x,y,type = 'l',xlab='Normal deviate',ylab='Distribution')

随机分布补充内容:

  1. 随机分布的cut函数
> Z<-rnorm(10000)
> table(cut(Z,breaks = -6:6))

(-6,-5] (-5,-4] (-4,-3] (-3,-2] (-2,-1]  (-1,0]   (0,1]   (1,2]   (2,3]   (3,4] 
      0       0      11     225    1301    3441    3476    1320     212      14 
  (4,5]   (5,6] 
      0       0 
  1. 随机分布set.seed函数:使每次set.seed后都是同一组随机数
> set.seed(3)
> rnorm(6)
[1] -0.96193342 -0.29252572  0.25878822 -1.15213189  0.19578283  0.03012394
> rnorm(6)
[1]  0.08541773  1.11661021 -1.21885742  1.26736872 -0.74478160 -1.13121857
> set.seed(3)
> rnorm(6)
[1] -0.96193342 -0.29252572  0.25878822 -1.15213189  0.19578283  0.03012394
  1. 多元正态分布生成随机数:mvrnorm()
    该函数的基本用法:
mvrnorm(n, mean, Sigma, tol = 1e-6, empirical = FALSE, EISPACK = FALSE)

其中各参数的含义如下:
·n:表示要生成的随机向量的个数。
·mean:表示多元正态分布的均值向量。
·Sigma:表示多元正态分布的协方差矩阵(正态对称矩阵)。
·tol:控制数值误差的容差,默认值为1e-6。
·empirical:一个逻辑值,如果为TRUE,则使用数据的经验协方差矩阵。默认值为FALSE。
·EISPACK:一个逻辑值,如果为TRUE,则使用EISPACK库中的算法来计算特征分解。默认值为FALSE。
示例:

> # 设置均值向量和协方差矩阵
> mean_vector <- c(1, 2)
> cov_matrix <- matrix(c(1, 0.5, 0.5, 2), nrow = 2)
> 
> # 生成随机向量
> random_vectors <- mvrnorm(n = 1000, mean_vector, Sigma = cov_matrix)
> 
> # 打印前几个随机向量
> head(random_vectors)
          [,1]        [,2]
[1,] 1.0776579  0.87763341
[2,] 0.7370851  2.27497857
[3,] 1.7883022  0.77470247
[4,] 1.1652272 -0.08411565
[5,] 2.2570566  2.40963053
[6,] 1.4947353  4.18532124

9.排序

(1)数的排序

> B<-sample(1:6)
> B
[1] 2 1 3 4 5 6
> order(B)
[1] 2 1 3 4 5 6
> B[order(B)]
[1] 1 2 3 4 5 6
> sort(B)#直接输出从小到达的结果
[1] 1 2 3 4 5 6

(2)数据框的排序

> studentdata1
  studentsID score     level
1          1    99 excellent
2          2    89    middle
3          3    93      good
> studentdata1[order(studentdata1$score),]#从低到高
  studentsID score     level
2          2    89    middle
3          3    93      good
1          1    99 excellent
> studentdata1[order(-studentdata1$score),]#从高到低
  studentsID score     level
1          1    99 excellent
3          3    93      good
2          2    89    middle

9.其他数学公式

(1)复数

> 0+1i#复数的输入格式
[1] 0+1i

(2)求导、求积分

> D(expression(x^3+2*x^2+x+1),"x")#求导
3 * x^2 + 2 * (2 * x) + 1

> integrate(dnorm,-Inf,Inf)#求积分
1 with absolute error < 9.4e-05

(3)计算函数

> f = function(x){return (x*(10-x))}

(4)求最值(maximum为TRUE求最大,反之求最小)

> optimize(f,interval = c(0:10),maximum = TRUE)
$maximum#取最大值时的取值
[1] 5

$objective#最大值

10.字符型函数

  1. 计算字符个数
> x<-c("ab","cd","efg")
> nchar(x)
[1] 2 2 3
  1. 取子字符串
> x<-"abcdefg"
> substr(x,3,5)#表示从第三个字符取到第五个字符
[1] "cde"
  1. 查找指定模式的字符串

11.Apply函数

在R语言中,apply()函数是一种常用的函数,用于对矩阵数组的行或列进行操作。它的主要作用是在数据集的维度上应用函数。apply()函数的语法如下:

apply(X, MARGIN, FUN, ...)

其中:
·X是一个矩阵或数组。
·MARGIN是一个整数向量,表示在哪个维度上应用函数。如果MARGIN为1,则在行上应用函数;如果为2,则在列上应用函数;如果为c(1, 2),则在行和列上分别应用函数。
·FUN是要应用的函数。
·…是传递给FUN的其他参数。

apply()函数的工作原理是将指定维度上的元素取出来形成一个向量,然后将这个向量作为参数传递给FUN函数。FUN函数可以是任何R中的函数,也可以是用户自定义的函数。
下面是apply()函数的一些常见用法:

  1. 对矩阵的行或列进行求和、平均、方差等统计操作:
> A<-matrix(1:12,3,4)
> A
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
> apply(A,1,sum)#对行求和
[1] 22 26 30
> apply(A,2,sum)#对列求和
[1]  6 15 24 33
  1. 对数组的某个维度进行操作:
> score1<-c(99,89,94)
> score2<-c(87,78,82)
> students<-data.frame(score1,score2)
> students
  score1 score2
1     99     87
2     89     78
3     94     82
> apply(students,2,mean)
  score1   score2 
94.00000 82.33333 

关于apply函数的练习:
在这里插入图片描述
1.创建该数据框

> ID<-1:10
> Course1<-c("Excellent","Good","Excellent","Excellent","Good","Excellent","Good","Excellent","Excellent","Good")
> score<-matrix(round(rnorm(40,85,5)),10,4)
> Course2<-score[,1]
> Course3<-score[,2]
> Course4<-score[,3]
> Course5<-score[,4]
> studentdata<-data.frame(ID,Course1,Course2,Course3,Course4,Course5)
> studentdata
   ID   Course1 Course2 Course3 Course4 Course5
1   1 Excellent      79      85      83      92
2   2      Good      80      89      82      80
3   3 Excellent      84      92      89      88
4   4 Excellent      90      96      86      76
5   5      Good      79      79      84      88
6   6 Excellent      85      82      90      82
7   7      Good      90      77      82      87
8   8 Excellent      79      71      82      91
9   9 Excellent      90      83      77      91
10 10      Good      90      90      82      85

score<-matrix(round(rnorm(40,85,5)),10,4)这段代码生成一个大小为10行4列的矩阵,其中的元素是根据正态分布随机生成的随机数,然后将这些随机数四舍五入为整数。

  1. rnorm(40, 85, 5):这个函数生成一个长度为40的随机数向量,这些随机数来自均值为85、标准差为5的正态分布。这个向量中的元素是根据这个正态分布随机生成的。
  2. round(rnorm(40, 85, 5)):将上述生成的随机数向量中的每个元素四舍五入为最近的整数。
  3. matrix(round(rnorm(40, 85, 5)), 10, 4):将上一步生成的四舍五入后的随机数向量重新组织成一个大小为10行4列的矩阵。这样,矩阵的每一行包含4个四舍五入后的随机数。
  1. 计算平均值和标准差
> averagecourse<-apply(studentdata[,3:6],2,mean)
> averagecourse
Course2 Course3 Course4 Course5 
   84.6    84.4    83.7    86.0 
> varcourses<-apply(studentdata[,3:6],2,sd)
> varcourses
 Course2  Course3  Course4  Course5 
5.081557 7.574812 3.802046 5.249339 
  1. 选出符合条件的学生
> newstudents<-subset(studentdata,Course1=="Excellent" & Course5>median(Course5))
> newstudents
  ID   Course1 Course2 Course3 Course4 Course5
1  1 Excellent      79      85      83      92
3  3 Excellent      84      92      89      88
8  8 Excellent      79      71      82      91
9  9 Excellent      90      83      77      91
  1. 计算平均分并排序
> studentdata$Average<-apply(studentdata[,3:6],1,mean)
> studentdata
   ID   Course1 Course2 Course3 Course4 Course5 Average
1   1 Excellent      79      85      83      92   84.75
2   2      Good      80      89      82      80   82.75
3   3 Excellent      84      92      89      88   88.25
4   4 Excellent      90      96      86      76   87.00
5   5      Good      79      79      84      88   82.50
6   6 Excellent      85      82      90      82   84.75
7   7      Good      90      77      82      87   84.00
8   8 Excellent      79      71      82      91   80.75
9   9 Excellent      90      83      77      91   85.25
10 10      Good      90      90      82      85   86.75
> studentdata[order(-studentdata $ Average),]
   ID   Course1 Course2 Course3 Course4 Course5 Average
3   3 Excellent      84      92      89      88   88.25
4   4 Excellent      90      96      86      76   87.00
10 10      Good      90      90      82      85   86.75
9   9 Excellent      90      83      77      91   85.25
1   1 Excellent      79      85      83      92   84.75
6   6 Excellent      85      82      90      82   84.75
7   7      Good      90      77      82      87   84.00
2   2      Good      80      89      82      80   82.75
5   5      Good      79      79      84      88   82.50
8   8 Excellent      79      71      82      91   80.75

注意:使用order函数后面还有一个逗号!

12.日期

  1. 输出:R语言中日期的标准格式是yyyy-mm-dd。
> as.Date("2024-03-18")
[1] "2024-03-18"
> class(as.Date("2024-03-18"))
[1] "Date"
> as.Date("03/18/2024")
Error in charToDate(x) : 
  character string is not in a standard unambiguous format
> as.Date("03/18/2024","%m/%d/%Y")#也可以通过定义来实现其他输入形式并转化为标准格式
[1] "2024-03-18"

注意:month必须在date前面

  1. 计算
  2. 输出
> date<-as.Date("2024-3-18")
> weekdays(date)#输出星期几
[1] "Monday"
> months(date)#输出月份
[1] "March"
> substr(as.POSIXct(date),1,4)#输出年份
[1] "2024"
> as.POSIXct(date)#输出日期时间类(更精确的时间)
[1] "2024-03-18 UTC"
> quarters(date)
[1] "Q1"

POSIXct class:日期时间类是用于表示日期和时间的一种更详细的类型。它包含年、月、日、时、分、秒等信息。POSIXct类的对象可以使用as.POSIXct()函数创建,其格式通常是YYYY-MM-DD HH:MM:SS。

13.数据输出

  1. 保存本地数据集.RData
# 生成一系列数据
data <- data.frame(ID = 1:10, Value = rnorm(10))

# 将数据保存到本地
save(data, file = "statistic app/data.RData")

# 加载数据
load("statistic app/data.RData")

# 查看加载的数据
print(data)
  1. 创建一个CSV文件
# 生成一系列数据
data <- data.frame(ID = 1:10, Value = rnorm(10))

# 使用write.csv函数
write.csv(data, "statistic app/data.csv", row.names = FALSE)
  1. 创建一个Excel文件
# 加载openxlsx包
library(openxlsx)

# 生成一系列数据
data <- data.frame(ID = 1:10, Value = rnorm(10))

# 将数据写入Excel文件
write.xlsx(data, file = "statistic app/data.xlsx", rowNames = FALSE)

三者比较:
RData最快,Excel最慢
RData占空间最小(存储大型数据节约空间)

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值