• (数据科学学习手札07)R在数据框操作上方法的总结(初级篇)


    上篇我们了解了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的最基本最简单的数据框操作方法,更进阶更高效的方法将在之后继续整理。

  • 相关阅读:
    使用VS2005搭建典型高效的SharePoint开发环境,提高生产效率,包含远程调试,自动部署 无为而为
    该死的Windows 2003 Server DMA设置,然我刻录DVD这么慢,终于找到办法了 无为而为
    听说Team Foundation Server 繁體中文版於 2006.04.28 RTM ,不知道微软中国的工作做得如何? 无为而为
    [软件开发过程]反模式:简单的部分留在需求人员的脑海中,只描述最复杂的部分给我们听 无为而为
    软件过程改进(SPI)常见反模式:第22条军规 无为而为
    在WebPart中上传图片到SharePoint图片库,读取Exif信息到图片的自定义属性 无为而为
    SQL Server 2005 Service Pack 1正式发布了,我想起,有人说,微软的软件至少要等到出了SP1才能用,那么现在可以用SQL2005了 无为而为
    可以下载Microsoft ISA Server 2006 试用版了,网管需要关注 无为而为
    超女带给我们什么? 无为而为
    Asp.net Url改写方法——采用HttpModules(转)
  • 原文地址:https://www.cnblogs.com/feffery/p/8563581.html
Copyright © 2020-2023  润新知