资讯动态

文本数据、宽数据、长数据

发布时间:2026/9/18 13:16:21 来源:尧图企业网站定制
一、文本数据1、创建文本数据主要包括创建判定大小写转换----创建----1数据中的文本常见于变量名文字变量譬如ID制图时的标题等2创建一个文本as.character(文字内容)需要用单引号或双引号将文本内容括起来#创建一个文本数据 as.character(hello,world) as.character(hello,world) #创建一个文本数据 as.character(hello,world) [1] hello,world as.character(hello,world) [1] hello,world----判定----3判断是否为文本is.character(需要判断的内容)#判断是否为文本 is.character(hello,world) is.character(hello,world) is.character(1) #判断是否为文本 is.character(hello,world) [1] TRUE is.character(hello,world) [1] TRUE is.character(1) [1] FALSE4文本数据的长度nchar(文本内容)标点符号和空格也会计算长度#文本的长度 nchar(hello) nchar(world) nchar(hello,world) #文本的长度 nchar(hello) [1] 5 nchar(world) [1] 5 nchar(hello,world) [1] 11----大小写转化----5大小写转化tolower(大写变小写)toupper(小写变大写)#大小写转换 tolower(Hello) toupper(hello) #大小写转换 tolower(Hello) [1] hello toupper(hello) [1] HELLO2、整理文本数据包括拼接、剪切和替换----拼接----1文本的拼接paste(A,B,sep分隔符)默认分隔符为空格#文本的拼接 paste(Hello,world,sep ) paste(Hello,world,sep,) paste(Hello,world) #文本的拼接 paste(Hello,world,sep ) [1] Hello world paste(Hello,world,sep,) [1] Hello,world paste(Hello,world) [1] Hello world2另外一种拼接方式paste0(A,B#没有默认分割符无缝拼接 paste0(Hello,world) paste0(Hello,world) [1] Helloworld----剪切----3文本的剪切substr(剪切的文本,起始位置,终止位置)#文本的剪切 substr(Hello, world,1,5) substr(Hello, world,8,12) substr(Hello, world,1,5) [1] Hello substr(Hello, world,8,12) [1] world4另一种剪切方式strsplit(剪切的文本,split 分割标志) 【相当于paste反过来】#另一种剪切方式 strsplit(Hello, world, split , ) #另一种剪切方式 strsplit(Hello, world, split , ) [[1]] [1] Hello world----替换----5文本的替换substr(被替换的文本,起始位置终止位置) - 替换的文本#文本的替换 x - c(Hello, world) substr(x,6,7) - :) x x - c(Hello, world) substr(x,8,12) - Beijing x #文本的替换 x - c(Hello, world) substr(x,6,7) - :) x [1] Hello:)world x - c(Hello, world) substr(x,8,12) - Beijing x [1] Hello, Beiji注意如果替换的文本长度长于需要替换的部分时会被切割掉。如何解决呢#解决方法 x - c(Hello, world) x - substr(x,1,5) paste(x,, Beijing) #解决方法 x - c(Hello, world) x - substr(x,1,5) paste(x,, Beijing) [1] Hello , Beijing6 通过文本中的规律替换sub(规律,替换文本,原始文本) 【但只会替换第一个符合规律的地方】#规律替换 sub(H,h,Hello, world) sub(o,0,Hello, world) #规律替换 sub(H,h,Hello, world) [1] hello, world sub(o,0,Hello, world) [1] Hell0, world7另一种文本替换的方式gsub((规律,替换文本,原始文本) 可以 【把每一个符合规律的地方替换】gsub(o,0,Hello, world) gsub(o,0,Hello, world) [1] Hell0, w0rld二、数据结构数据的类型数值num、字符chr、逻辑logi、etc.数据的形式向量vector、矩阵matrix、列表list、etc.数据的结构宽数据wide format长数据long format1、宽数据wide format在宽数据中来着同一观察对象的不同观察值被归纳于同一行中的不同变量中特点变量多观察值少一般是ID值变量名2、长数据long format如同一个受式对象分别接受A、B、C三种测试来自于同一观察对象的不同的观察值被记录于不同行中特点变量少观察值多一般是ID值类别变量名三、数据重组reshape——长数据与宽数据的转换1、“reshape2”和“data.table”两个拓展包#安装reshape2拓展包 install.packages(reshape2) library(reshape2) install.packages(data.table) library(data.table)2、宽数据 → 长数据1首先了解数据的概况2需要用reshape2拓展包中的melt命令reshape::melt(data 数据框id.vars c(ID,Age,Sex,Status),-------保持不变的变量measure.vars c(TestA,TestB,TestC),-------要转换的变量variable.name Test,------转换后新的分类变量名value.name Test.Result)-----转换后的数值变量名#宽数据转换为长数据 data.long - reshape2::melt(data data.wide, id.vars c(ID,Age,Sex,Status), measure.vars c(TestA,TestB,TestC), variable.name Test, value.name Test.Result) #第一位研究对象转换之前的数据 data.wide[data.wide$ID 1,] #第一位研究对象转换之后的数据 data.long[data.long$ID 1,] #宽数据转换为长数据 data.long - reshape2::melt(data data.wide, id.vars c(ID,Age,Sex,Status), measure.vars c(TestA,TestB,TestC), variable.name Test, value.name Test.Result) data.wide[data.wide$ID 1,] ID Age Sex Status TestA TestA.date TestB TestB.date TestC TestC.date 1 1 38.36 0 01.642008-08-292.892008-07-098.452009-01-25 data.long[data.long$ID 1,]ID Age Sex StatusTestTest.Result1 1 38.36 0 0TestA1.64101 1 38.36 0 0TestB2.89201 1 38.36 0 0TestC8.45转化后的数据框如下注意没有选择的变量如“TestA.date”,则不会展示在转换后的数据框中3、长数据 → 宽数据需要用到reshape2包中的dcast命令reshape2::dcast(data 数据框formula ID Age Sex Status~Test---保持不变的变量~分类变量转换依据value.var Test.Result) ------变量值的来源#宽数据转换为长数据 data.wide1 - reshape2::dcast(data data.long, formula ID Age Sex Status ~ Test, value.var Test.Result) data.long[data.long$ID 1,] data.wide1[data.wide1$ID 1,] #宽数据转换为长数据 data.wide1 - reshape2::dcast(data data.long, formula ID Age Sex Status ~ Test, value.var Test.Result) data.long[data.long$ID 1,] ID Age Sex Status Test Test.Result 1 1 38.36 0 0 TestA 1.64 101 1 38.36 0 0 TestB 2.89 201 1 38.36 0 0 TestC 8.45 data.wide1[data.wide1$ID 1 ,] ID Age Sex Status TestA TestB TestC 1 1 38.36 0 0 1.64 2.89 8.45转换后新的长数据如下注意以上方法只能对一个分类变量进行转换。四、同时转换多个数据项1、方法1根据分类数据选择相应的列1首先将长数据转换为宽数据并保留日期数据#首先先将宽数据转换为长数据主要转换依据为Test的种类 data.long.multi - reshape2::melt(data data.wide, id.vars c(ID,Age,Sex,Status,TestA.date,TestB.date,TestC.date), measure.vars c(TestA, TestB,TestC), variable.nameTest, value.nameTest.Result)转换结果如下此时可以看到在TestA这一行中保存了三种数据的测试日期这不是我们需要的2使用条件语句增加一列测试日期的变量#使用条件语句新增一列求出不同测试的时间 data.long.multi$Test.date - ifelse(data.long.multi$TestTestA,data.long.multi$TestA.date, ifelse(data.long.multi$TestTestB,data.long.multi$TestB.date,data.long.multi$TestC.date)) #告诉R这个新的变量是日期变量 data.long.multi$Test.date - as.Date(data.long.multi$Test.date,origin1970-01-01) #删除 TestA.date, TestB.date, TestC.date 这三个变量 data.long.multi - subset(data.long.multi,select-c(TestA.date,TestB.date,TestC.date))转换后的结果如下这次才是是我们想要的结果2、方法2自己动手先剪切再拼接1首先对TestA进行剪切#对TestA进行操作 #先剪切生成一个只含TestA数据的数据框从原始数据框中挑选五个变量 data.wide.A - subset(data.wide,selectc(ID,Age,Sex,Status,TestA,TestA.date)) #将新数据框中TestA重新命名为TestA.Result names(data.wide.A)[names(data.wide.A) TestA] - Test.Result #将新数据框中TestA重新命名为Test.date names(data.wide.A)[names(data.wide.A) TestA.date] - Test.date #在新的数据框中增加一个Test的变量来表示测试的类型 data.wide.A$Test - TestA转换的结果下图所示2对测试B和测试C进行相同的操作代码如下# B data.wide.B - subset(data.wide,selectc(ID,Age,Sex,Status,TestB,TestB.date)) names(data.wide.B)[names(data.wide.B) TestB] - Test.Result names(data.wide.B)[names(data.wide.B) TestB.date] - Test.date data.wide.B$Test - TestB # C data.wide.C - subset(data.wide,selectc(ID,Age,Sex,Status,TestC,TestC.date)) names(data.wide.C)[names(data.wide.C) TestC] - Test.Result names(data.wide.C)[names(data.wide.C) TestC.date] - Test.date data.wide.C$Test - TestC3对三个新生成的数据框进行合并# combine A,B,C data.long.multi2 - rbind(data.wide.A,data.wide.B,data.wide.C)可以得到相同的结果如下3、方法3使用data.table包1首先先将宽数据转换成data.table的形式# data.wide to data.table format data.wide.table - as.data.table(data.wide) str(data.wide.table) # data.wide to data.table format data.wide.table - as.data.table(data.wide) # 查看data.table的结构 str(data.wide.table) Classes ‘data.table’ and data.frame: 100 obs. of 10 variables: $ ID : int 1 2 3 4 5 6 7 8 9 10 ... $ Age : num 38.4 30.7 20 48.3 40 ... $ Sex : int 0 1 0 1 0 0 1 1 0 1 ... $ Status : int 0 0 0 1 1 0 1 1 0 0 ... $ TestA : num 1.64 6.73 0.54 2.44 2.8 ... $ TestA.date: Date, format: 2008-08-29 2006-07-12 ... $ TestB : num 2.89 6.68 0.24 5.3 4.27 ... $ TestB.date: Date, format: 2008-07-09 2008-11-08 ... $ TestC : num 8.45 6.33 3.99 13.88 1.82 ... $ TestC.date: Date, format: 2009-01-25 2008-06-25 ... - attr(*, codepage) int 65001 - attr(*, .internal.selfref)externalptr2使用data.table拓展包中的melt命令#使用data.table拓展包中的melt命令该命令与reshape中的melt不同要转换的变量可以是多个变量 data.long.multi3 - data.table::melt(data data.wide.table, id.vars c(ID,Age,Sex,Status), measure.vars list(c(TestA, TestB,TestC), c(TestA.date,TestB.date,TestC.date)), variable.name Test, value.name c(Test.Result, Test.date))一样可以得到同样的效果如下图#以上内容均为医咖会R语言基础课程个人笔记仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价