上篇我们了解了Python中pandas内封装的关于数据框的常用操作方法,而作为专为数据科学而生的一门语言,R在数据框的操作上则更为丰富精彩,本篇就R处理数据框的常用方法进行总结:
1.数据框的生成
利用data.frame()函数来创建数据框,其常用参数如下:
...:数据框的构成向量的变量名,顺序即为生成的数据框列的顺序
row.names:对每一行命名的向量
stringAsFactors:是否将数据框中字符型数据类型转换为因子型,默认为FALSE
> a <- 1:10 > b <- 10:1 > c <- c('a','b','c','d','e','f','g','h','i','j') > df <- data.frame(a,b,c,row.names = c) > df a b c a 1 10 a b 2 9 b c 3 8 c d 4 7 d e 5 6 e f 6 5 f g 7 4 g h 8 3 h i 9 2 i j 10 1 j
改变stringAsFactors的默认值,第三列数据的数据类型发生了改变:
> a <- 1:10 > b <- 10:1 > c <- c('a','b','c','d','e','f','g','h','i','j') > df <- data.frame(a,b,c,row.names = c, stringsAsFactors = F) > str(df) 'data.frame': 10 obs. of 3 variables: $ a: int 1 2 3 4 5 6 7 8 9 10 $ b: int 10 9 8 7 6 5 4 3 2 1 $ c: chr "a" "b" "c" "d" ... > df <- data.frame(a,b,c,row.names = c, stringsAsFactors = T) > str(df) 'data.frame': 10 obs. of 3 variables: $ a: int 1 2 3 4 5 6 7 8 9 10 $ b: int 10 9 8 7 6 5 4 3 2 1 $ c: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
2.数据框的索引
方式1:
按列的名称进行索引
> df$a
[1] 1 2 3 4 5 6 7 8 9 10
> df$a[2:10]
[1] 2 3 4 5 6 7 8 9 10
方式2:
按对应轴的标号进行索引
> df[2] b a 10 b 9 c 8 d 7 e 6 f 5 g 4 h 3 i 2 j 1 > df[2:4,] a b c b 2 9 b c 3 8 c d 4 7 d
方式3:
通过attach()将数据框临时挂载,直接通过列名索引数据
> df <- data.frame('AA'=a,'B'=b,'C'=c,row.names = c, stringsAsFactors = T) > attach(df) > AA [1] 1 2 3 4 5 6 7 8 9 10 > B [1] 10 9 8 7 6 5 4 3 2 1 > detach(df)
方式4:
通过with()将数据框临时挂载,以直接通过列名索引数据
> df <- data.frame('AA'=a,'B'=b,'C'=c,row.names = c, stringsAsFactors = F) > with(df,{ C }) [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
3.数据框的拼接
rbind()与cbind():
> df1 <- data.frame(a,b,c,row.names = c, stringsAsFactors = F) > df2 <- data.frame('AA'=b,'B'=a,'C'=c,row.names = c, stringsAsFactors = F) > cbind(df1,df2)#cbind()按列横向拼接数据框 a b c AA B C a 1 10 a 10 1 a b 2 9 b 9 2 b c 3 8 c 8 3 c d 4 7 d 7 4 d e 5 6 e 6 5 e f 6 5 f 5 6 f g 7 4 g 4 7 g h 8 3 h 3 8 h i 9 2 i 2 9 i j 10 1 j 1 10 j
> rbind(df1,df1)#按列纵向拼接数据框(列名一定要对应) a b c 1 1 10 a 2 2 9 b 3 3 8 c 4 4 7 d 5 5 6 e 6 6 5 f 7 7 4 g 8 8 3 h 9 9 2 i 10 10 1 j 11 1 10 a 12 2 9 b 13 3 8 c 14 4 7 d 15 5 6 e 16 6 5 f 17 7 4 g 18 8 3 h 19 9 2 i 20 10 1 j
4.数据框的合并操作
在R中,通过内联键合并数据框的函数为merge(),其主要参数如下:
by:对两个数据框建立内联的共有列(元素交集部分不能为空集),以此列为依据,返回内联列取交集后剩下的样本行
sort:是否对合并后的数据框以内联列为排序依据进行排序,默认为TRUE
suffixes:对合并后数据框同名的列采取的重命名的后缀内容
> a <- 1:10 > b <- 10:1 > c <- c('b','a','c','d','e','f','g','h','i','j') > d <- c('b','a','c','d','e','f','g','h','k','j') > df1 <- data.frame(a,'ID'=c, stringsAsFactors = F) > df2 <- data.frame(b,'ID'=d,stringsAsFactors = F) > df1 a ID 1 1 b 2 2 a 3 3 c 4 4 d 5 5 e 6 6 f 7 7 g 8 8 h 9 9 i 10 10 j > df2 b ID 1 10 b 2 9 a 3 8 c 4 7 d 5 6 e 6 5 f 7 4 g 8 3 h 9 2 k 10 1 j
对上述两个数据框以’ID‘列为内联列进行合并,得到结果如下,与Python不同的是,R中的数据框合并的原则是不返回含有缺失值的行
> merge(df1,df2,by='ID') ID a b 1 a 2 9 2 b 1 10 3 c 3 8 4 d 4 7 5 e 5 6 6 f 6 5 7 g 7 4 8 h 8 3 9 j 10 1
设置sort为FALSE
> merge(df1,df2,by='ID',sort=FALSE) ID a b 1 b 1 10 2 a 2 9 3 c 3 8 4 d 4 7 5 e 5 6 6 f 6 5 7 g 7 4 8 h 8 3 9 j 10 1
5.数据框的抽样筛选
利用样本抽取函数sample()通过对行或列进行范围之指定进行数据框的抽样筛选:
> df1[sample(1:nrow(df1),3,replace=FALSE),] a ID 6 6 f 10 10 j 2 2 a
6.数据框的条件筛选
方式1:
普通的条件筛选:
> df1[df1$a >= 6,] a ID 6 6 f 7 7 g 8 8 h 9 9 i 10 10 j > df1[df1$a >= 6 & df1$a <= 9,] a ID 6 6 f 7 7 g 8 8 h 9 9 i
方式2:
利用subset()函数来进行条件筛选,其第一个输入值为待筛选的数据框,第二个位置写入行筛选的条件(或多个条件的逻辑符连接的组合筛选),第三个select参数控制选中的列:
> subset(df1, a >= 6& a <=8) a ID 6 6 f 7 7 g 8 8 h > subset(df1, a >= 6& a <=8, select='ID') ID 6 f 7 g 8 h
7.数据框的去重
这里我们使用重复值检测函数duplicated()以及数据框元素删减方法联合起来完成去重的工作,先依次介绍这两个方法:
duplicated(),用于检测输入的列中有无符合元素重复的行(若输入多列则检测是否存在行的多列组合方式中有无满足重复的行),并返回对应每一列的逻辑型变量。
> a <- 1:10 > c <- c('b','a','c','d','b','a','d','c','i','j') > d <- c('b','a','c','d','b','a','g','c','k','j') > df <- data.frame(c,c,d) > df c c.1 d 1 b b b 2 a a a 3 c c c 4 d d d 5 b b b 6 a a a 7 d d g 8 c c c 9 i i k 10 j j j > duplicated(df) [1] FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE FALSE FALSE
可以看出,bbb,aaa,ccc这三种组合方式在数据框中重复多次,因此对这三种方式第二次及以后出现的情况返回TRUE,其余的行返回FALSE
数据框删除方法:df[!需要删除的行,!需要删除的列]
上面的duplicated(df)已经提取出df的所有重复行的逻辑型标号,因此只需要在删除方法里设置删除的标号为duplicated(df)的返回值即可:
> df[!duplicated(df),] c c.1 d 1 b b b 2 a a a 3 c c c 4 d d d 7 d d g 9 i i k 10 j j j
可以看到,所有重复行均已清除。
8.数据框的排序
数据框的order()函数:
> a <- c(2:8,1,10,9) > c <- c('b','a','c','d','b','a','d','c','i','j') > d <- c('b','a','c','d','b','a','g','c','k','j') > df <- data.frame(a,c,d) > df a c d 1 2 b b 2 3 a a 3 4 c c 4 5 d d 5 6 b b 6 7 a a 7 8 d g 8 1 c c 9 10 i k 10 9 j j > newdata <- df[order(a)] Error in `[.data.frame`(df, order(a)) : undefined columns selected > newdata a c d 1 1 b b 2 2 a a 3 3 c c 4 4 d d 5 5 b b 6 6 a a 7 7 d g 8 8 c c 9 9 i k 10 10 j j
9.缺失值的处理
有时候我们会遇到含有缺省值NA的数据框,这时如果直接进行数据框内的运算,因为NA的干扰,最后的结果往往也是NA,好在R对大部分整体数值运算都有参数na.rm来控制,TRUE时会自动跳过含有NA的计算部分:
> a <- c(1,2,4,3,NA) > c <- c('b','a','c','d','b') > d <- c('b','a','c','d','b') > df <- data.frame(a,c,d) > df a c d 1 1 b b 2 2 a a 3 4 c c 4 3 d d 5 NA b b > mean(df[,1]) [1] NA > mean(df[,1],na.rm = T) [1] 2.5
使用na.omit()剔除残缺的行:
> df a c d 1 1 b b 2 2 a a 3 4 c c 4 3 d d 5 NA b b > complete.cases(df)#识别数据集中位置有无缺省值 [1] TRUE TRUE TRUE TRUE FALSE > which(complete.cases(df)==F)#显示所有含有缺省值的行标号 [1] 5 > sum(complete.cases((df)))#完整观测值的个数 [1] 4 > na.omit(df)#删去含有缺失值的行 a c d 1 1 b b 2 2 a a 3 4 c c 4 3 d d
以上就是R的最基本最简单的数据框操作方法,更进阶更高效的方法将在之后继续整理。