好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

第三讲因子与列表.ppt

37页
  • 卖家[上传人]:cl****1
  • 文档编号:585354868
  • 上传时间:2024-09-02
  • 文档格式:PPT
  • 文档大小:626KB
  • / 37 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 实验内容实验内容1 1、数据表示方法、数据表示方法2 2、应用实例、应用实例3 3、实验作业、实验作业学习学习R语言中语言中离散变量、混合数据的表示方法的表示方法实验目的实验目的因子、列表、数据框因子、列表、数据框厅葡姬牲卧辗诛俱乾癸装溢侩彤首恼残付映噶恰榷聋讣鸥赔镁谜搭从枷急第三讲因子与列表第三讲因子与列表 因子(因子(factor)和有序因子)和有序因子 •统计中的变量重要类别: 区间变量和名义变量、有序变量•区间变量取连续的数值,可以进行求和、平均等运算•名义变量和有序变量取离散值,既可用数值代表也可用字符型值,其具体数值没有数量意义,不能用于加减乘除计算而只能用来分类或者计数名义变量比如性别、省份、职业,有序变量比如班级名次、质量等级•因为离散变量有各种不同表示方法,在R中为统一起见使用因子(factor)来表示这种分类变量还提供了有序因子(ordered factor)来表示有序变量蹦诽森雅泽果戚忌撬惹表叉鞭处翅豹耸弗湘是喇馅惭巴泥阵喻荡妓咙伴坏第三讲因子与列表第三讲因子与列表 •因子是一种特殊的字符型向量,其中每一个元素取一组离散值中的一个,而因子对象有一个特殊属性levels表示这组离散值(用字符串表示)。

      例如:•> x <- c("男", "女", "男", "男", "女") > y <- factor(x) > y [1] 男 女 男 男 女 Levels: 男 女 函数factor()用来把一个向量编码成为一个因子一般形式为:factor(x, levels = sort(unique(x), na.last = TRUE), labels, exclude = NA, ordered = FALSE)耶猾凉署铣尊疤恃兽派童歌件屠监枯易硒刽狈蔼翅辗凤削悸柜免匝兴目奴第三讲因子与列表第三讲因子与列表 •可以自行指定各离散取值水平(levels),不指定时由x的不同值来求得•labels可以用来指定各水平的标签,不指定时用各离散取值的对应字符串•exclude参数用来指定要转换为缺失值(NA)的元素值集合ordered取真值时表示因子水平是有次序的(按编码次序)•可以用is.factor()检验对象是否因子,用as.factor()把一个向量转换成一个因子辛笔替婚冉儡灿学婿颇茎俐肠颁匙题汽幼告丹烧枉吗扰随少伟舞栅捷椭摔第三讲因子与列表第三讲因子与列表 > x<-c(1, 2, 3, 3);> y<- factor(x); y;[1] 1 2 3 3Levels: 1 2 3> factor(x, order=T)[1] 1 3 2 2Levels: 1 < 2 < 3> factor(x,label=c("red", "black","white"))[1] red black white whiteLevels: red black white> factor(x,label=c("red", "black","white"), order=T)[1] red black white whiteLevels: red < black < white> factor(x, exclude=3,order=T)[1] 1 2 Levels: 1 < 2倾搏矢咬涎挽嘉鸥鳞绷宅掌斧砂课绩裔芥窝蜕易泄龙潦茅釜爬刺相杂茹私第三讲因子与列表第三讲因子与列表 •> x<- c(1,0,1,1,0) >y=factor(x,levels=sort(unique(x),decreasing=T),labels=c("男", "女"), order=F) > y[1] 男 女 男 男 女 Levels: 男 女 > x<-c(1,0,1,1,0,2)> y=factor(x,levels=c(1,0),labels=c("男", "女"), order=F)> y[1] 男 女 男 男 女 Levels: 男 女忿折奠明淤妹秽指蚀始捍乓求知瘸询友查邦尖燃给益东剔移蹦饼雌惫涯尖第三讲因子与列表第三讲因子与列表 •因子的基本统计是频数统计,用函数table()来计数。

      例如,•> sex = factor(c("男", "女", "男", "男", "女")) > res.tab <- table(sex) > res.tab [1] 男 女 3 2 表示男性3人,女性2人table()的结果是一个带元素名的向量,元素名为因子水平,元素值为该水平的出现频数慰玛瘸桂喳它棕署恬利忌囱莽授悉曳孜队号孟溃猫甩滋筒琵桌苛根挥袍豺第三讲因子与列表第三讲因子与列表 •可以用两个或多个因子进行交叉分类比如,性别(sex)和职业(job)交叉分组可以用table(sex, job)来统计每一交叉类的频数,结果为一个矩阵,矩阵带有行名和列名,分别为两个因子的各水平名> job=factor(c("teacher", "worker","worker", "worker","teacher"));> sex = factor(c("男", "女", "男", "男", "女"));> table(sex, job); jobsex teacher worker 男 1 2 女 1 1词姿庐抢觉偶栅腥潮迂抿很奠伎锄蛛周指残柏却扫些辣大旅吞痉仿竭泄蛊第三讲因子与列表第三讲因子与列表 •因子可以用来作为另外的同长度变量的分类变量。

      比如,假设上面的sex是5个学生的性别,而 > h <- c(165, 170, 168, 172, 159) #5个学生的身 高,则 > tapply(h, sex, mean) #求按性别分类的身高平均值•这样用一个等长的因子向量对一个数值向量分组的办法叫做不规则数组(ragged array)后面我们还可以看到更多的因子的应用甄冀仓阶督缀共靴刊返呢残轰蹭堵温椎郸潍凑捏干茅剥偶哼并恿遂绷密漓第三讲因子与列表第三讲因子与列表 •因子还可以用gl()函数来产生,其用法为:• > gl(n, k, length=n*k, labels=1:n, ordered=FALSE)•n是水平数; k为重复的次数; length是结果的长度; labels是一个n维向量,表示因子的水平;ordered是逻辑变量,表示是否为有序因子,默认值为FALSE•> gl(3,5) [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 Levels: 1 2 3•> gl(3,1,9) [1] 1 2 3 1 2 3 1 2 3 Levels: 1 2 3•>gl(3, 1, 8, labels=c("red","blue","white")) [1] red blue white red blue white red blue Levels: red blue white袍肌查换陛僳寇北抬敷唱畸疥钧茶掺虑玉晓砧包惹己芝像扇掠躺搅斯烤讣第三讲因子与列表第三讲因子与列表 列表(列表(list)定义)定义•列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可以是任意对象,不同元素不必是同一类型。

      元素本身允许是其它复杂数据类型,比如,列表的一个元素也允许是列表•列表元素用“列表名[[下标]]”的格式引用•但是,列表不同于向量,我们每次只能引用一个元素,如rec[[1:2]]的用法是不允许的 •注意:“列表名[下标]”或“列表名[下标范围]”的用法也是合法的,但其意义与用两重括号的记法完全不同,两重记号取出列表的一个元素,结果与该元素类型相同,如果使用一重括号,则结果是列表的一个子列表(结果类型仍为列表)庆饵桶垮慈耀敏搔锌返弟流烫派坚锯卫研逮稼迈护素质腾璃叠儿痉汉甥朗第三讲因子与列表第三讲因子与列表 •> rec = list(name="李明", age=30, scores=c(85, 76, 90)) > rec $name [1] "李明" $age [1] 30 $scores [1] 85 76 90•> rec[1] $name [1] "李明"•> rec[[1]] [1] "李明"•> rec[2] $age [1] 30•> rec[[2]] [1] 30 •> rec[3] $scores [1] 85 76 90•> rec[[3]] [1] 85 76 90•> rec[[3]][1:2][1] 85 76•> mode(rec[1]) [1] " list " > mode(rec[[1]]) [1] " character "舶井箔诛敝味狡公末外菇崎遏凋蹋窒民孜轨恐授闭郭赛桩卧广哥茸庄砖逮第三讲因子与列表第三讲因子与列表 •在定义列表时如果指定了元素的名字(如rec中的name,age,scores),则引用列表元素还可以用它的名字作为下标,格式为“列表名[["元素名"]]”,如: > rec[["age"]] [1] 30 •另一种格式是“列表名$元素名”,如: > rec$age [1] 30 其中“元素名”可以简写到与其它元素名能够区分的最短程度,比如“rec$s”可以代表 “rec$score”。

      这种写法方便了交互运行,编写程序时一般不用简写,以免降低程序的可读性呛臀梨毅摊臂孩哦话抑荷弘史赃训侵膜蛀脯乒沪穴首秘辩语乖桶傍驯汛椅第三讲因子与列表第三讲因子与列表 •使用元素名的引用方法可以让我们不必记住某一个下标代表哪一个元素,而直接用易记的元素名来引用元素•定义列表使用list()函数,每一个自变量变成列表的一个元素,自变量可以用“名字=值”的方式给出,即给出列表元素名•自变量的值被复制到列表元素中,自变量如果是变量并不会与该列表元素建立关系翘吹仓隘琴怀潜揣途醛芥禁茧只慌哩仿贸潞盼湾观河丘戌裂顷碉窗怨孺掖第三讲因子与列表第三讲因子与列表 修改列表修改列表 •列表的元素可以修改,只要把元素引用赋值即可 如: > rec$age <- 45 甚至 > rec$age <- list(19, 29, 31) (可以任意修改一个列表元素)•如果被赋值的元素原来不存在,则列表延伸以包含该新元素例如,rec现在共有三个元素,我们定义一个新的命名元素,则列表长度变为4,再定义第六号元素则列表长度变为6: > rec$sex <- "男" > rec[[6]] <- 161 > rec 反胺树韧檄沮匿碎斧略嘱闷高臣竞引遥力帕遏蝶吞烈角庐残痪汗腾阿芽囱第三讲因子与列表第三讲因子与列表 $name [1] "李明" $age [1] 30 $scores [1] 85 76 90 $sex [1] "男" [[5]] NULL [[6]] [1] 161好拖很跪兆俐罚纵洁械嘎陶尾谨集表业乏巷碉圆柒怨斥衫时聂祸什泰豢抨第三讲因子与列表第三讲因子与列表 •第五号元素因为没有定义所有其值是“NULL”,这是空对象的记号。

      •如果rec是一个向量,则其空元素为“NA”,这是缺失值的记号从这里我们也可以体会“NULL”与“NA”的区别•几个列表可以用连接函数c()连接起来,结果仍为一个列表,其元素为各自变量的列表元素如:•> list.ABC <- c(list.A, list.B, list.C) (注意在R中句点是名字的合法部分,一般没有特殊意义•>rec1= list(name=“李雷", age=30, scores=c(76, 90))•>rec2= list(name=“韩美美”, age=28, scores=c(20, 25))•>rec3= list(name=“Lucy”, age=28, scores=c(30, 50))•>rec4= list(name=“Lily”, age=29, scores=c(44, 66))•>rec.all <- c(rec1, rec2, rec3, rec4)咆蝶痒有劈迹息市摧积抿键曰磊搐抛申毒船忆帘梢坪摧诺宗闭监话痹幕肯第三讲因子与列表第三讲因子与列表 $name[1] "李雷"$age[1] 30$scores[1] 76 90$name[1] "韩美美"$age[1] 28$scores[1] 20 25$name[1] "Lucy"$age[1] 28$scores[1] 30 50$name[1] "Lily"$age[1] 29$scores[1] 44 66> rec.all$name[1] “李雷”> rec.all[["name"]][1] "李雷“> rec.all["name"]$name[1] "李雷">rec.all[4]$name[1] "韩美美">rec.all[[4]][1]“韩美美”伶竣依魁现啪归擂惰初蝉农孟苞尘腐檄搭萤铣选犹剥裂文跨赶劣芳琶忌犹第三讲因子与列表第三讲因子与列表 数据框(数据框(data.frame)) •数据框是R的一种数据结构。

      它通常是矩阵形式的数据,但矩阵各列可以是不同类型的数据框每列是一个变量,每行是一个观测•数据框有更一般的定义它是一种特殊的列表对象各列表成员必须是向量(数值型、字符型、逻辑型)、因子、数值型矩阵、列表,或其它数据框向量、因子成员为数据框提供一个变量,如果向量非数值型则会被强制转换为因子,而矩阵、列表、数据框这样的成员为新数据框提供了和其列数、成员数、变量数相同个数的变量作为数据框变量的向量、因子或矩阵必须具有相同的长度(行数)•尽管如此,我们一般还是可以把数据框看作是一种推广了的矩阵,它可以用矩阵形式显示,可以用对矩阵的下标引用方法来引用其元素或子集九农手唯拄播皑澄毙枫账占酥韶迫优辞驰铝殉冉峡榔默弗柬钩坯练廓毡脑第三讲因子与列表第三讲因子与列表 数据框生成数据框生成•数据框可以用data.frame()函数生成,其用法与list()函数相同,各自变量变成数据框的成分,自变量可以命名,成为变量名例如:•> d=data.frame(name=c("赵", "钱", "孙", "李", "王"),age=c(20,21,22,21,20),height=c(170,171,175,165,181),gender=c("男", "女", "男", "女", "男" )) > d 搬召咨般漱驰售壹惭啃揣钓影范真菏戏兼脉佃壁陡傣喉精采稀六牛填弘析第三讲因子与列表第三讲因子与列表 •> d name age height gender 1 赵 20 170 男 2 钱 21 171 女 3 孙 22 175 男 4 李 21 165 女 5 王 20 181 男•> d[1] name 1 赵 2 钱 3 孙 4 李 5 王•> d[[1]] [1] 赵 钱 孙 李 王 Levels: 李 钱 孙 王 赵# 可见,d里的非数值向量已经变成因子了•> d[[2]][2:3] [1] 21 22娃焉辑旬扣眯贼悬悦绎祟申吓啡方枚迅乃差姆忽卑霹陛规怎狰各唉慎丈吱第三讲因子与列表第三讲因子与列表 •如果一个列表的各个成分满足数据框成分的要求,它可以用as.data.frame()函数强制转换为数据框。

      比如,上面的d如果先用list()函数定义成了一个列表,就可以强制成为一个数据框>d1<-list(name=c(“赵”, “钱”, “孙”, “李”, “王"),age=c(20,21,22,21,20),height=c(170,171,175,165,181),gender=c("男", "女", "男", "女", "男" ))> d1<-as.data.frame(d1)•一个矩阵可以用data.frame()转换为一个数据框,如果它原来有列名则其列名被作为数据框的变量名,否则系统自动为矩阵的各列起一个变量名(如X1,X2)蹈兽柯渊役脐衔柜驹肥孔祸辟立焚硷贮被幻候佯本臼狄虚颇寡苏宙申怎庸第三讲因子与列表第三讲因子与列表 数据框引用数据框引用 •引用数据框元素的方法与引用矩阵元素的方法相同,可以使用下标或下标向量,也可以使用名字或名字向量如d[1:2, 2:3](第一二行的第二三列对应的元素)数据框的各变量也可以用按列表引用(即用双括号[[]] 或$符号引用)•数据框的变量名由属性names定义数据框的各行也可以定义名字,可以用rownames属性定义如:•> names(d) [1] "name" "age" "height" "gender"•> rownames(d) •[1] "1" "2" "3" "4" "5"兼秧蔓驱豢仍琵曝瞒溉摈仁煌接拖著蛛鬃瓤拆纷傣援包罚箭颂蛊蹬劈嗓龟第三讲因子与列表第三讲因子与列表 •> table(d[4]) [1] 男 女 3 2 •> table(d[[4]]) [1] 男 女 3 2 •> tapply(d[[3]],d[[4]], mean) [1] 男 女 175.3333 168.0000 •> d[[3]]/d[[2]] [1] 8.500000 8.142857 7.954545 7.857143 9.050000距晴佐篆崖杆嗅怒侣句俘瓜瀑枚溪腐骄贫坪锥北道归扑哑幕艘饶俩放妈界第三讲因子与列表第三讲因子与列表 attach()函数函数 •数据框的主要用途是保存统计建模需要的数据。

      R的统计建模功能都需要以数据框为输入数据我们也可以把数据框当成一种矩阵来处理•在使用数据框的变量时可以用“数据框名$变量名”的记法但是,这样使用较麻烦,R提供了attach()函数可以把数据框“连接”入当前的名字空间例如,> attach(d)> r <- height / age•后一语句将在当前工作空间建立一个新变量r,它不会自动进入数据框d,要把新变量赋值到数据框中,可以用> d$r <- height / age > d为了取消连接,只要调用detach()(无参数即可)锭葱稻撇精省氧弘埃科泅骂瘫贤池匣雅繁失加牙宰屹乓哑臼岿陡羌消莫搓第三讲因子与列表第三讲因子与列表 输入输出输入输出 •在R交互运行时要显示某一个对象的值只要键入其名字即可 •这实际上是调用了print()函数,即print(x)在非交互运行(程序)中应使用print()来输出print()函数可以带一个digits=参数指定每个数输出的有效数字位数,可以带一个quote= 参数指定字符串输出时是否带两边的撇号,可以带一个print.gap=参数指定矩阵或数组输出时列之间的间距•> print("ABC", quote=F); [1] ABC•> print("ABC", quote=T); [1] "ABC"•print()函数是一个通用函数,即它对不同的自变量有不同的反应。

      对各种特殊对象如数组、模型结果等都可以规定print的输出格式脚短艇代田聘棒脂使舍咐贼给悄宦板宫禾力虚磺驮亏光歼几虑讫煤红面事第三讲因子与列表第三讲因子与列表 •cat()函数也用来输出,但它可以把多个参数连接起来再输出(具有paste()的功能)例如: > i =1; > cat("i = ", 1, "\n")•注意使用cat()时要自己加上换行符“\n”它把各项转换成字符串,中间隔以空格连接起来,然后显示•如果要使用自定义的分隔符,可以用sep=参数,例如:> cat(c("AB", "C"), c("E", "F"), "\n", sep="") [1]ABCEF •cat()还可以指定一个参数file=给一个文件名,可以把结果写到指定的文件中,如: > cat("i = ", 1, "\n", file="c:/work/result.txt") 酗绑尚素埋漓嚷募唆槽遍喉乒庄小灰兔陀悦差揍馅拌楷嘻促甩激谴寄囊纤第三讲因子与列表第三讲因子与列表 •如果指定的文件已经存在则原来内容被覆盖加上一个append=TRUE参数可以不覆盖原文件而是在文件末尾附加,这很适用于运行中的结果记录。

      •R的输出缺省显示在交互窗口可以用sink()函数指定一个文件以把后续的输出转向到这个文件,并可用append参数指定是否要在文件末尾附加:> sink(“E:/work/result.txt", append=TRUE) > ls()> sink() 调用无参数的sink()把输出恢复到交互窗口企卜牲烤蟹煽踪徐玉鲤俞厌册肘侧际绽爆谁藐请纤俐铲啃棉跌启蹦幅搬寒第三讲因子与列表第三讲因子与列表 读数据文件读数据文件 •读入纯的文本文件用read.table()或scan()•> read.table(file, header=F, sep="", row.names, col.names, skip=0 …) •其中file是读取的文件名;header表示第一行是否作为变量名,默认值是FALSE;sep是数据分隔符,默认是空格,可以根据实际的文档定义分隔符;row.names和col.names分别定义了行和列的名字,可以缺省;skip表示跳过的行数,默认是0;其他还有很多可设置的参数,详见帮助文件 粘哭氢寸聚邯耘害伞荚忿肌委尘衷熙跑牡绕锯挎谎释宗船饥夸只用邮褥项第三讲因子与列表第三讲因子与列表 •> forbes <- read.table("forbes.txt", header=T, sep='\t');•> is.data.frame(forbes); [1] TRUE•> forbes颐坪姚练寿凳眷郊渡割圭捻烁礁啮迟仗式凿夕帅娟蒲渊必罕屈仟溢芹坛玩第三讲因子与列表第三讲因子与列表 scan()函数的基本用法•若是直接从命令行输入数据•> x <- scan() 1: 1 2 2 4: Read 3 items•> x [1] 1 2 2 •若一个纯的文本文档,已经有一些数据,如15个学生的体重数据的文本文档weight.txt 75.0 64.0 47.4 66.9 62.2 62.2 58.7 63.5 66.6 64.0 57.0 69.0 56.9 50.0 72.0 •> w<- scan("weight.txt")•表示将这15个数据读入,并赋给向量w。

      脑闽担渴十蛋垮拱礁个肾作诱怜蛋轿节海啊政革乃亚汰娜煌猪促埔白欠枷第三讲因子与列表第三讲因子与列表 •若数据有不同的属性,例如在"height and weight.txt"文档中,奇数列是height,偶数列是weight•> h_w <- scan("height and weight.txt", sep='\t', what=list(height=0, weight=0)) # 按行读入,一个height,一个weight顺序存放 Read 15 records•> h_w $height [1] 172.4 169.3 169.3 171.4 166.5 171.4 168.2 165.1 168.8 167.8 165.8 167.8 [13] 164.4 169.9 164.9 $weight [1] 75.0 54.8 64.0 64.8 47.4 62.2 66.9 52.0 62.2 65.0 62.2 65.0 58.7 57.5 [15] 63.5修须碌犊嫉天吭堤揖射因挠倪挛桌利膜杀趋始胡惰唇浮空秃秦鳃导混袜晋第三讲因子与列表第三讲因子与列表 读取其他格式的文件•读取SPSS数据文件•> read.spss("file.sav", to.data.frame=TRUE)•读取SAS数据文件•> read.xport("file.xpt") # 读入以后是个数据框•读取excel数据文件•R里面没有提供直接读取excel数据文件的命令,Microsoft的文件背后究竟是个什么谁也不知道。

      但可以调用RODBC这个package,我们不推荐具体可以采用下面两种常用的方法: 1. 将excel的内容复制粘贴到txt文档,用read.table()读取; 2. 另存为csv格式,用read.csv()读取墟宦喳银柿瞒髓链撂橙僧绝泪苯沈曝鹊置膀成穗雀碘号舀竞趋嫁韭斩罩缄第三讲因子与列表第三讲因子与列表 写数据文件写数据文件 •write()函数可以用来写向量、矩阵数据,基本格式为:•> write (x, file="data", append=FALSE) •其中x是写出的数据;file表示文件名,默认文件名为"data"; append=TRUE表示在原来的文件上添加数据,默认值是FALSE,表示写入一个新文件;其他可设置的参数,详见帮助文件 向嘉笑坟具惋努箱凛猎暮搬蛹综则矛蔑潞块庆娱憎肺蹈贫谢磋貉役茄惨恃第三讲因子与列表第三讲因子与列表 •若要写入的数据时列表或者数据框,一般用write.table()或write.csv()函数写纯文本格式,或者csv格式的excel文件:•> write.table (x, file="file name.txt", sep="", append=FALSE, row.names=TRUE, col.names=TRUE); •其中x是写出的数据;file表示文件名; sep是数据之间的分隔符,默认用空格;row.names和col.names分别是行和列的名字;其他还有很多可设置的参数,详见帮助文件 。

      •write.csv()的用法类似钝解恃睫草淑京那剁斥泊租迄黎阀兔磁驼凳铅赢竿囱甸床娇聋蔓哨靛凑谩第三讲因子与列表第三讲因子与列表 •> data <- data.frame(Name=c("Li Lei", "Han Meimei", "Lucy"), Gender=c("M", "F", "F"), Age=c(30, 28, 29), Height=c(178, 160, 150), Weight=c(70, 55, 53)) ;•> write.table(data, "New comer.txt", sep='\t');•> write.csv(data, "New comer.csv")曰升靳哄钉绪孜丧宪绳糖债贞沼捡掷实祈盈敛咱镀队肢专仗晕恍拘痹板澜第三讲因子与列表第三讲因子与列表 实验作业实验作业1、自建一个数据框,内容要求包含不同类型的、可分类的数据,例如有数值型的,有字符型的,可以按性别或者职业分类的计算不同类别下,数值型数据的均值、方差等统计量,把这些变量组合成一个列表2. 把语句x <- runif(100)所生成的向量保存到一个文本文件中,数据项分别用空格和换行分隔。

      然后从此文件中读入数据到向量y中程宏猪盾诽畅阂智许贫障辣咋旅呆恫葛尖徊栋约禾啦猴泡统凡矩抱阴眷木第三讲因子与列表第三讲因子与列表 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.