R学习笔记 第三篇:数据框

Posted 悦光阴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R学习笔记 第三篇:数据框相关的知识,希望对你有一定的参考价值。

数据框(data.frame)用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同的数据列的数据类型可以相同,也可以不同,但是,每列的长度必须相同。数据框的每列可以有唯一的命名,在已创建的数据框上,用户可以添加计算列,这样,R根据同一行的数据列值得出相应的数据列的值。数据框是数据分析中最重要的数据对象,必须熟练掌握数据框的操作。

一,创建数据框

R提供三种方式,用于创建数据框,第一种是通过读取文件创建,常用的是用于读取文件的函数是read.table,而read.csv是read.table的包装函数,专门用于读取csv文件,例如:

`dataset` = read.csv(D:/data.csv, check.names = FALSE, encoding = "UTF-8", blank.lines.skip = FALSE);

第二种是从数据库执行查询,根据查询结果创建数据框;当连接SQL Server数据库时,使用ODBC数据库连接,引用RODBC包,调用odbcConnect连接,使用sqlquery执行查询,获取查询结果:

library(RODBC)
cn=odbcConnect("data source")
a_data_frame=sqlQuery(cn,"TSQL Query")
odbcClose(cn)

第三种是通过函数 data.frame创建数据框,用户需要输入指定的数据填充数据框变量。函数data.frame的参数row.names为每一行命名,把该参数设置为NULL,取消行的命名:

> a_data_frame=data.frame(
+     c1=letters[1:3],
+     c2=c(1:3),
+     c3=runif(3)>0.5,
+     c4=c(‘r,‘g,‘b),
+     row.names=c(r1,r2,r3)
+ )

打印数据框,数据框有两个维度,行和列:

> a_data_frame
   c1 c2    c3 c4
r1  a  1  TRUE  r
r2  b  2 FALSE  g
r3  c  3 FALSE  b

如何查看数据框的维度名称和各个维度的元素数量?R提供相应的函数来实现,通过函数rownames返回数据框的行名称,通过函数colnames返回数据框的列名称,通过函数nrow(或函数ncol),返回数据框的行数(或列数)。

> rownames(a_data_frame)
[1] "r1" "r2" "r3"
> colnames(a_data_frame)
[1] "c1" "c2" "c3" "c4"
> nrow(a_data_frame)
[1] 3
> ncol(a_data_frame)
[1] 4

二,索引数据框

索引数据库,使用中括号,而下标有四种表示方式:正整数,负整数,逻辑值和字符(行或列的名称),

例如,索引数据框中第一行,第二列的元素:

> a_data_frame[1,2]
[1] 1

1,通过索引获取数据框的子集

例如,获得数据框的一个子集,索引数据框中的第一行和第二行,第二列和第三列的数据子集:

> a_data_frame[1:2,2:3]
   c2    c3
r1  1  TRUE
r2  2 FALSE

2,通过条件获取数据框的子集

函数subset,第一个参数(x)是数据框;第二个参数(subset)是逻辑表达式,用于过滤数据行;第三个参数(select)是映射的数据列。

> subset(a_data_frame,c2<=2,c(2:3))
   c2    c3
r1  1  TRUE
r2  2 FALSE

三,操纵数据框

操纵数据框,例如,选择子集(subset),合并数据框,排序数据框,添加或修改数据列,把数据值排名等,最终把数据转换成相应的形式,用于数据分析。

1,合并数据框

当两个数据框有相同的数据列时,可以使用merge函数合并数据框,merge函数的作用类似于SQL 语言中的连接(Join)操作,用于把两个数据框,按照特定的数据列把两个数据框做连接操作,参数的定义如下:

merge(x, y, 
      by = intersect(names(x), names(y)), by.x = by, by.y = by, 
      all = FALSE, all.x = all, all.y = all,
      sort = TRUE, 
      suffixes = c(".x",".y"),...)

参数释义:

  • x,y 参数:指定合并的两个数据框;
  • by参数:字符串,指定合并列,当两个数据框有相同的数据列名字时,merge函数将按照同名的数据列名称合并;
  • by.x,by.y 参数:字符串,分别指定数据框的合并列,用于指定merge函数将按照数据框x和y的哪些数据列进行合并;
  • all:逻辑值,完全显示两个数据框的所有数据行,当合并列的值不存在于数据框x或y中,该数据框的列值显示为NA;
  • all.x,all.y:逻辑值,指定完全显示的数据框,例如,当折merge函数的all.x=TRUE,all.y=FALSE是,合并的结果把数据框x的数据列全部显示,如果合并列的值不存在于数据框y,那么y的其他数据列显示为NA。
  • sort:逻辑值,指定是否对结果排序;
  • suffixes:为非合并列添加后缀;

 例如,创建两个数据框,按照df1的数据列x,和数据框df2的数据列m,对这两个数据框执行合并操作:

> df1=data.frame(x=c(a,c,e),y=1:3)
> df2=data.frame(m=c(a,c,f),n=4:6)
> merge(df1,df2,by.x=x,by.y=m)
  x y n
1 a 1 4
2 c 2 5
> 
> merge(df1,df2,by.x=x,by.y=m,all=TRUE)
  x  y  n
1 a  1  4
2 c  2  5
3 e  3 NA
4 f NA  6

2,添加和替换列

方法1:直接对数据框的数据列进行赋值,来实现对数据框的数据列的添加或替换:

df1[,z]=c(z1,z2,z3)

方法2:使用with参数,with函数(with(data, expr))接受一个数据框对象和要计算的表达式作为输入参数,with函数返回值是表达式的值,with函数只能添加或修改一个数据列:

df1[,z]=with(df1,c(z1,z2,z3))

方法3:使用within函数,within函数(within(data, expr))接受一个数据框对象和要计算的表达式作为输入参数,within函数返回的是更新后的数据框对象,within函数可以在大括号中添加多个表达式,能够一次操作多个数据列:

df1=within(df1,{z=c(z1,z2,z3)} )

方法4:使用plyr包中的mutate函数,该函数用于向数据框中添加数据列或转换已经存在的数据列,接受一个数据框对象,和多个”name=value“对,返回修改后的数据框对象:

mutate(df1,z=c(z1,z2,z3))

3,排序

order函数能够对数据框进行排序,order(x)函数:返回第i个元素是x中元素在排序之后的序号,对数据框进行排序时,可以分两步进行下去,第一步获取行的序号,第二部按照行号查询数据框:

> y_order=order(df1[,y])
> df1[y_order,]

还有一个方法,使用plyr包中的arrange函数,只用一行就能实现对数据框的排序:

arrange(df1,y)

4,排名

rank函数为数据框中的每个元素进行排名,不过rank函数只能作用于向量,只能返回向量元素的排名:

rank(x, na.last = TRUE,
     ties.method = c("average", "first", "last", "random", "max", "min"))

 

 

附:read.table 函数的定义和参数释义

read.table(file, header = FALSE, sep = "", quote = "\"‘",
           dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
           row.names, col.names, as.is = !stringsAsFactors,
           na.strings = "NA", colClasses = NA, nrows = -1,
           skip = 0, check.names = TRUE, fill = !blank.lines.skip,
           strip.white = FALSE, blank.lines.skip = TRUE,
           comment.char = "#",
           allowEscapes = FALSE, flush = FALSE,
           stringsAsFactors = default.stringsAsFactors(),
           fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)

重要的参数释义:

  • file:读取数据的文件名和路径,文件名可以是文件的绝对路径名,或是相对路径名,如果文件名是相对路径名,那么文件名是基于当前的工作目录,当前的工作目录可以通过函数 getwd() 获取;
  • header:逻辑值,文件的第一行是否包含列名;
  • sep:用于指定字段(列)的分隔符,默认值是空字符,行的分隔符是回车和换行;
  • quote:字符的引用符,只有当文本使用引用符,才被视为字符,设置为空字符,禁用引用符;
  • dec:小数点符号;
  • check.names:逻辑值,是否检查列名是否符合变量的命名规范;
  • fill:逻辑值,当设置为TRUE时,如果行的列数不够,那么填充空白的字段;
  • strip.white:逻辑值,只有当sep参数指定时,用于移除字符字段两端的空格;
  • blank.lines.skip :逻辑值,当为TRUE时,跳过空白的数据行;
  • encoding :字符串,用于指定字符的编码规则,常用的编码规则是UTF-8;
  • nrows :整数值,能够读取的最大数据行数量;
  • skip:整数值,从文件的开头,跳过一定数量的数据行,从下一行开始读取数据;

 

参考文档:

R Document

以上是关于R学习笔记 第三篇:数据框的主要内容,如果未能解决你的问题,请参考以下文章

pytorch学习笔记第三篇———自动梯度(torch.autograd)

linux学习笔记 第三篇

网络安全应急演练学习笔记第三篇之实施和总结阶段

R实战 第三篇:数据处理(基础)

小白入门深度学习 | 第三篇:深度学习初体验

第三篇:R语言数据可视化之条形图