当前位置:   article > 正文

R语言-数据框dataframe的使用_r语言as.data.frame函数

r语言as.data.frame函数

1、数据框是R语言里中的一种数据结构,其内部可以由多种数据类型,每一列是一个变量,每行是一个观测记录。在R中数据框是很通用的数据结构,它是一种特殊的列表对象
2、初始化数据框

  1. > mydataframe=data.frame(
  2. + name=c(\"张三\", \"李四\", \"王五\", \"赵六\", \"丁一\"),
  3. + sex=c(\"F\", \"F\", \"M\", \"M\", \"M\"),
  4. + age=c(16, 17, 18, 16, 19),
  5. + height=c(167.5, 156.3, 177.3, 167.5, 170.0),
  6. + weight=c(55.0, 60.0, 63.0, 53.0, 69.5)
  7. + );
  8. > mydataframe
  9.   name sex age height weight
  10. 1 张三   F  16  167.5   55.0
  11. 2 李四   F  17  156.3   60.0
  12. 3 王五   M  18  177.3   63.0
  13. 4 赵六   M  16  167.5   53.0
  14. 5 丁一   M  19  170.0   69.5
复制代码
2、List数据可以转成dataframe

  1. > mylist<-list(
  2. + name=c(\"张三\", \"李四\", \"王五\", \"赵六\", \"丁一\"),
  3. +  sex=c(\"F\", \"F\", \"M\", \"M\", \"M\"),
  4. +  age=c(16, 17, 18, 16, 19),
  5. +  height=c(167.5, 156.3, 177.3, 167.5, 170.0),
  6. + weight=c(55.0, 60.0, 63.0, 53.0, 69.5)
  7. + );
  8. > mylist
  9. $name
  10. [1] \"张三\" \"李四\" \"王五\" \"赵六\" \"丁一\"
  11. $sex
  12. [1] \"F\" \"F\" \"M\" \"M\" \"M\"
  13. $age
  14. [1] 16 17 18 16 19
  15. $height
  16. [1] 167.5 156.3 177.3 167.5 170.0
  17. $weight
  18. [1] 55.0 60.0 63.0 53.0 69.5
  19. > mylist=as.data.frame(mylist)
  20. > mylist
  21.   name sex age height weight
  22. 1 张三   F  16  167.5   55.0
  23. 2 李四   F  17  156.3   60.0
  24. 3 王五   M  18  177.3   63.0
  25. 4 赵六   M  16  167.5   53.0
  26. 5 丁一   M  19  170.0   69.5
复制代码
3、矩阵可以转化为数据框,如果原来有列名,那么列名将被改作为数据框的变量名,如果没有列名,那系统会自动为矩阵的各列起一个变量名,如:V1,V2,V3...
  1. > x=array(1:12,c(3,4))
  2. > x
  3. [,1] [,2] [,3] [,4]
  4. [1,] 1 4 7 10
  5. [2,] 2 5 8 11
  6. [3,] 3 6 9 12
  7. > x=as.data.frame(x)
  8. > x
  9. V1 V2 V3 V4
  10. 1 1 4 7 10
  11. 2 2 5 8 11
  12. 3 3 6 9 12
复制代码
4、数据框的引用
(1)使用下标引用
  1. > mydataframe[1:4,3:5]
  2. age height weight
  3. 1 16 167.5 55
  4. 2 17 156.3 60
  5. 3 18 177.3 63
  6. 4 16 167.5 53
复制代码
说明:表示显示第1到第3行的第3到第5列的数据
(2)按列表名引用
  1. > mydataframe[[\"weight\"]]
  2. [1] 55.0 60.0 63.0 53.0 69.5
  3. > mydataframe[[\"height\"]]
  4. [1] 167.5 156.3 177.3 167.5 170.0
  5. > mydataframe$height
  6. [1] 167.5 156.3 177.3 167.5 170.0
复制代码
(3)数据框的names的作用(修改列名、行名)
  1. > names(mydataframe)
  2. [1] \"name\" \"dex\" \"age\" \"height\" \"weight\"
  3. > mydataframe
  4. name dex age height weight
  5. 1 张三 F 16 167.5 55.0
  6. 2 李四 F 17 156.3 60.0
  7. 3 王五 M 18 177.3 63.0
  8. 4 赵六 M 16 167.5 53.0
  9. 5 丁一 M 19 170.0 69.5
  10. > rownames(mydataframe)=c(\"第一行\",\"第二行\",\"第三行\",\"第四行\",\"第五行\")
  11. > mydataframe
  12. name dex age height weight
  13. 第一行 张三 F 16 167.5 55.0
  14. 第二行 李四 F 17 156.3 60.0
  15. 第三行 王五 M 18 177.3 63.0
  16. 第四行 赵六 M 16 167.5 53.0
  17. 第五行 丁一 M 19 170.0 69.5
  18. > colnames(mydataframe)=c(\"第一列\",\"第二列\",\"第三列\",\"第四列\",\"第五列\")
  19. > mydataframe
  20. 第一列 第二列 第三列 第四列 第五列
  21. 第一行 张三 F 16 167.5 55.0
  22. 第二行 李四 F 17 156.3 60.0
  23. 第三行 王五 M 18 177.3 63.0
  24. 第四行 赵六 M 16 167.5 53.0
  25. 第五行 丁一 M 19 170.0 69.5
复制代码
5、attach函数,数据框的主要用途是保存统计建模的数据,R的统计建模功能都需要以数据框为输入数据,我们可以把数据框当成一种矩阵来处理。在使用数据框的变量时可以使用“数据框名$变量名”来获取数据框的变量值。但是这种用法比较麻烦,R提供attach() 函数可以把数据框中的变量“连接”到内存中,这样便于数据框数据的调用。
(1)使用attach()函数将数据框加载到内存中

  1. > attach(mydataframe)
  2. > r=height/weight
  3. 错误: 找不到对象\'height\'
  4. > r=\'第四列\'/\'第五列\'
  5. 错误于\"第四列\"/\"第五列\" : 二进列运算符中有非数值参数
  6. > mydataframe=mylist
  7. > attach(mydataframe)
  8. > r=height/weight
  9. > r
  10. [1] 3.045455 2.605000 2.814286 3.160377 2.446043
复制代码

(2)将新的变量添加到数据框中
  1. > mydataframe
  2. name sex age height weight
  3. 1 张三 F 16 167.5 55.0
  4. 2 李四 F 17 156.3 60.0
  5. 3 王五 M 18 177.3 63.0
  6. 4 赵六 M 16 167.5 53.0
  7. 5 丁一 M 19 170.0 69.5
  8. > mydataframe$myR=height/weight
  9. > mydataframe
  10. name sex age height weight myR
  11. 1 张三 F 16 167.5 55.0 3.045455
  12. 2 李四 F 17 156.3 60.0 2.605000
  13. 3 王五 M 18 177.3 63.0 2.814286
  14. 4 赵六 M 16 167.5 53.0 3.160377
  15. 5 丁一 M 19 170.0 69.5 2.446043
  16. >
复制代码

6、编辑数据框(手动修改)
(1)使用edit() 函数
    
  1. mydataframenew=edit(mydataframe)
复制代码

(2)使用fix函数
  
  1.   fix(mydataframe)
复制代码
7、merge函数对数据框的操作,从两个数据框中选择出条件相等的行组合成一个新的数据框
  1. df1=data.frame(name=c("aa","bb","cc"),age=c(20,29,30),sex=c("f","m","f"))
  2. df2=data.frame(name=c("dd","bb","cc"),age=c(40,35,36),sex=c("f","m","f"))
  3. mergedf=merge(df1,df2,by="name")
复制代码
 

8、subset函数,从某一个数据框中选择出符合某条件的数据或是相关的列
(1)单条件查询
  1. > selectresult=subset(df1,name=="aa")
  2. > selectresult
  3.   name age sex
  4. 1   aa  20   f
  5. > df1
  6.   name age sex
  7. 1   aa  20   f
  8. 2   bb  29   m
  9. 3   cc  30   f
复制代码
(2)指定显示列
  1. > selectresult=subset(df1,name=="aa",select=c(age,sex))
  2. > selectresult
  3.   age sex
  4. 1  20   f
复制代码
(3)多条件查询
  1. > selectresult=subset(df1,name=="aa" & sex=="f",select=c(age,sex))
  2. > selectresult
  3.   age sex
  4. 1  20   f
  5. > df1
  6.   name age sex
  7. 1   aa  20   f
  8. 2   bb  29   m
  9. 3   cc  30   f
复制代码


Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的。

Data Frame每一列有列名,每一行也可以指定行名。如果不指定行名,那么就是从1开始自增的Sequence来标识每一行。

初始化

使用data.frame函数就可以初始化一个Data Frame。比如我们要初始化一个student的Data Frame其中包含ID和Name还有Gender以及Birthdate,那么代码为:
student<-data.frame(ID=c( 11, 12, 13),Name=c( " Devin ", " Edward ", " Wenli "),Gender=c( " M ", " M ", " F "),Birthdate=c( " 1984-12-29 ", " 1983-5-6 ", " 1986-8-8”))
另外也可以使用read.table() read.csv()读取一个文本文件,返回的也是一个Data Frame对象。读取数据库也是返回Data Frame对象。
查看student的内容为:
  ID   Name Gender  Birthdate
1  11  Devin      M 1984-12-29
2  12 Edward      M   1983-5-6
3  13  Wenli      F   1986-8-8
这里只指定了列名为ID,Name,Gender和Birthdate,使用names函数可以查看列名,如果要查看行名,需要用到row.names函数。这里我们希望将ID作为行名,那么可以这样写:
row.names(student)<-student$ID
更简单的办法是在初始化date.frame的时候,有参数row.names可以设置行名的向量。

访问元素

与Matrix一样,使用[行Index,列Index]的格式可以访问具体的元素。
比如访问第一行:
student[ 1,]
访问第二列:
student[, 2]
使用列的Index或者列名可以选取要访问的哪些列。比如要ID和Name,那么代码为:
idname<-student[ 1: 2]
或者是
idname<-student[c( " ID ", " Name”)]
如果是只访问某一列,返回的是Vector类型的,那么可以使用[[或者$来访问。比如我们要所有student的Name,代码为:
name<-student[[ 2]] 或者name<-student[[“Name”]] 或者name<-student$Name
使用attach和detach函数可以使得访问列时不需要总是跟着变量名在前面。
比如要打印所有Name,那么可以写成:
attach(student)
print(Name)
detach(student)
还可以换一种简洁一点的写法就是用with函数:
with(student,{
  n<-Name
  print(n)
})
这里的n作用域只在大括号内,如果想在with函数中对全局的变量进行赋值,那么需要使用<<-这样一个运算符。

修改列数据类型

接下来我们查看该对象每列的类型,使用str(student)可以得到如下结果:
'data.frame':3 obs. of  4 variables:
 $ ID       : num  1 2 3
 $ Name     : Factor w/ 3 levels "Devin","Edward",..: 1 2 3
 $ Gender   : Factor w/ 2 levels "F","M": 2 2 1
 $ Birthdate: Factor w/ 3 levels "1983-5-6","1984-12-29",..: 2 1 3
默认情况下,字符串向量都会被自动识别成Factor,也就是说,ID是数字类型,其他的3个列都被定义为Factor类型了。显然这里Name应该是字符串类型,Birthdate应该是Date类型,我们需要对列的数据类型进行更改:
student$Name<- as.character(student$Name)
student$Birthdate<- as.Date(student$Birthdate)
下面我们再运行str(student)看看修改后的结果:
'data.frame':3 obs. of  4 variables:
 $ ID       : num  11 12 13
 $ Name     : chr  "Devin" "Edward" "Wenli"
 $ Gender   : Factor w/ 2 levels "F","M": 2 2 1
 $ Birthdate: Date, format: "1984-12-29" "1983-05-06" "1986-08-08”

添加新列

对于以及存在的student对象,我们希望增加Age列,该列是根据Birthdate算出来的。首先需要知道怎么算年龄。我们可以使用日期函数Sys.Date()获得当前的日期,然后使用format函数获得年份,然后用两个年份相减就是年龄。好像R并没有提供几个能用的日期函数,我们只能使用format函数取出年份部分,然后转换为int类型相减。
student$Age<- as.integer(format(Sys.Date(), " %Y "))- as.integer(format(student$Birthdate, " %Y”))
这样写似乎太长了,我们可以用within函数,这个函数和之前提到过的with函数类似,可以省略变量名,不同的地方是within函数可以在其中修改变量,也就是我们这里增加Age列:
student<-within(student,{
  Age<- as.integer(format(Sys.Date(), " %Y "))- as.integer(format(Birthdate, " %Y "))
})

查询/子集

查询一个Date Frame,返回一个满足条件的子集,这相当于数据库中的表查询,是非常常见的操作。使用行和列的Index来获取子集是最简单的方法,前面已经提到过。如果我们使用布尔向量,配合which函数,可以实现对行的过滤。比如我们要查询所有Gender为F的数据,那么我们首先对student$Gender==“F”,得到一个布尔向量:FALSE FALSE  TRUE,然后使用which函数可以将布尔向量中TRUE的Index返回,所以我们的完整查询语句就是:
student[which(student$Gender== " F "),]
注意这里列Index并没有输入,如果我们只想知道所有女生的年龄,那么可以改为:
student[which(student$Gender== " F "), " Age”]
这样的查询写法还是复杂了点,可以直接使用subset函数,那么查询会简单些,比如我们把查询条件改为年龄<30的女性,查姓名和年龄,那么查询语句为:
subset(student,Gender== " F " & Age< 30 , select=c( " Name ", " Age "))
使用SQL查询Data Frame
对于我这种使用了多年SQL的人来说,如果能够直接写SQL语句对Data Frame进行查询操作,那是多么方便美妙的啊,结果还真有这么一个包:sqldf。
同样是前面的需求,对应的语句就是:
library(sqldf)
result<-sqldf( " select Name,Age from student where Gender='F' and Age<30 ")

连接/合并

对于数据库来说,对多表进行join查询是一个很正常的事情,那么在R中也可以对多个Data Frame进行连接,这就需要使用merge函数。
比如除了前面申明的student对象外,我们再申明一个score变量,记录了每个学生的科目和成绩:
score<-data.frame(SID=c( 11, 11, 12, 12, 13),Course=c( " Math ", " English ", " Math ", " Chinese ", " Math "),Score=c( 90, 80, 80, 95, 96))
我们看看该表的内容:
  SID  Course Score
1  11    Math    90
2  11 English    80
3  12    Math    80
4  12 Chinese    95
5  13    Math    96
这里的SID就是Student里面的ID,相当于一个外键,现在要用这个ID进行inner join操作,那么对应的R语句就是:
result<-merge(student,score,by.x= " ID ",by.y= " SID ")
我们看看merge以后的结果:
 ID   Name Gender  Birthdate Age  Course Score
1 11  Devin      M 1984-12-29  31    Math    90
2 11  Devin      M 1984-12-29  31 English    80
3 12 Edward      M 1983-05-06  32    Math    80
4 12 Edward      M 1983-05-06  32 Chinese    95
5 13  Wenli      F 1986-08-08  29    Math    96
正如我们期望的一样join在了一起。
除了join,另外一个操作就是union,这也是数据库常用操作,那么在R中如何将两个列一样的Data Frame Union联接在一起呢?虽然R语言中有union函数,但是不是SQL的Union的意思,我们要实现Union功能,需要用到rbind函数。
rbind的两个Data Frame必须有相同的列,比如我们再申明一个student2,将两个变量rbind起来:
student2<-data.frame(ID=c( 21, 22),Name=c( " Yan ", " Peng "),Gender=c( " F ", " M "),Birthdate=c( " 1982-2-9 ", " 1983-1-16 "),Age=c( 32, 31))
rbind(student,student2)




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/66086
推荐阅读
相关标签
  

闽ICP备14008679号