zoukankan      html  css  js  c++  java
  • R语言data.frame的常用操作总结

    前言:近段时间学习R语言用到最多的数据格式就是data.frame,现对data.frame常用操作进行总结,其中函数大部分来自dplyr包,该包由Hadley Wickham所作,主要用于数据的清洗和整理。

    一、创建

    data.frame创建较为容易,调用data.frame函数即可。本文创建一个关于学生成绩的数据框,接下来大部分操作都对该数据框进行,其中学生成绩随机产生

     1 > library(dplyr)       #导入dplyr包
     2 > options(digits = 0)  #保留整数
     3 > set.seed(1)          #设置种子函数
     4 > df <- data.frame(ID = 1:12,                                 #ID
     5 +                  Class = rep(c(1,2,3),4),                   #班级
     6 +                  Chinese = runif(12,min = 0,max = 100),     #语文
     7 +                  Math = runif(12,min = 0,max = 100),        #数学
     8 +                  English = runif(12,min = 0,max = 100))     #英语
     9 > for (i in 1:ncol(df)) {
    10 +   df[,i] <- as.integer(df[,i])  #将每列类型变为integer型
    11 + }

    df结果如下

     1 > df
     2    ID Class Chinese Math English
     3 1   1     1      26   68      26
     4 2   2     2      37   38      38
     5 3   3     3      57   76       1
     6 4   4     1      90   49      38
     7 5   5     2      20   71      86
     8 6   6     3      89   99      34
     9 7   7     1      94   38      48
    10 8   8     2      66   77      59
    11 9   9     3      62   93      49
    12 10 10     1       6   21      18
    13 11 11     2      20   65      82
    14 12 12     3      17   12      66

    二、 查询

    1、查询某一行或某一列

    可通过 data.frame[行号,] 或者 data.frame[,列号] 操作完成

    其中 data.frame[行号,] 得到的类型是数据框

    而 data.frame[,列号] 得到的类型是该列的类型

    > df[2,]
      ID Class Chinese Math English
    2 2 2 37 38 38 > df[,4] [1] 68 38 76 49 71 99 38 77 93 21 65 12

    查询某一列还可以通过 data.frame$列名 操作完成

    > df$Chinese
     [1] 26 37 57 90 20 89 94 66 62  6 20 17

     data.frame[列号] 得到一个仅包含该列内容的数据框

     1 > df[3]
     2    Chinese
     3 1       26
     4 2       37
     5 3       57
     6 4       90
     7 5       20
     8 6       89
     9 7       94
    10 8       66
    11 9       62
    12 10       6
    13 11      20
    14 12      17

    若要查找符合条件的行,可采用 which() 函数,得到的类型是数据框

    > df[which(df$ID == 4),]
      ID Class Chinese Math English
    4  4     1      90   49      38

    2、查询某一个值

    可通过 data.frame[行号,列号] 或 data.frame[行号,‘列名’] 操作完成

    > df[3,4]
    [1] 76
    > df[3,'Math']
    [1] 76

    若查找符合条件的值,可采用 which() 函数

    > df[which(df$Chinese == 57),'Math'] #查询语文成绩为57的同学的数学成绩
    [1] 76
    > df[which(df$Class == 2),'English'] #查询班级号为2的同学的英语成绩
    [1] 38 86 59 82

    三、修改

    1、修改某一行或列

    > df[1,] <- c(1,2,65,59,73)  #修改第一行
    #修改英语成绩
    > df[,'English'] <- c(23,45,67,87,34,46,87,95,43,76,23,94) 

    修改后结果为(1号同学英语成绩先由26修改为73,再修改为23)

     1 > df
     2    ID Class Chinese Math English
     3 1   1     2      65   59      23
     4 2   2     2      37   38      45
     5 3   3     3      57   76      67
     6 4   4     1      90   49      87
     7 5   5     2      20   71      34
     8 6   6     3      89   99      46
     9 7   7     1      94   38      87
    10 8   8     2      66   77      95
    11 9   9     3      62   93      43
    12 10 10     1       6   21      76
    13 11 11     2      20   65      23
    14 12 12     3      17   12      94

    2、修改某一个值

    直接将需要修改后的值赋给上述查询某一个值的操作即可

     1 > df[3,'Chinese'] <- 65 #将3号同学的语文成绩修改为65
     2 #将语文成绩低于20的同学的语文成绩修改为20
     3 > df[which(df$Chinese < 20),'Chinese'] <- 20
     4 > df
     5        ID Class Chinese Math English
     6 1   1     2      65   59      23
     7 2   2     2      37   38      45
     8 3   3     3      65   76      67
     9 4   4     1      90   49      87
    10 5   5     2      20   71      34
    11 6   6     3      89   99      46
    12 7   7     1      94   38      87
    13 8   8     2      66   77      95
    14 9   9     3      62   93      43
    15 10 10     1      20   21      76
    16 11 11     2      20   65      23
    17 12 12     3      20   12      94

    3、修改行列名

    可用rownames()及colnames()得到数据框的行列名,rownames(data.frame)[行号] 或 colnames(data.frame)[列号] 可得到指定位置的行名或者列名,若修改直接赋值给该变量即可

    1 > colnames(df)               #查询列名
    2 [1] "ID"      "Class"   "Chinese" "Math"    "English"
    3 > colnames(df)[4]            #查询第4列列名
    4 [1] "Math"
    5 > colnames(df)[4] <- "math"  #修改第4列列名为math
    6 #修改列名
    7 > colnames(df) <- c("ID","Class","Chinese","Math","English")

    四、删除

    删除行或列,仅需要选出该数据框的部分行或列,然后将其赋给该变量即可,其中在列号或行号前添加-表示不选该行或该列,在这里,为了方便接下来的操作,我们将选出后的数据框赋给其他变量,要实现删除操作应当将选出后的数据框赋给自己

     1 #选出df第1、3、5列  ( df <- df[,c(1,3,5)] )
     2 > df.tmp <- df[,c(1,3,5)]  
     3 > df.tmp
     4    ID Chinese English
     5 1   1      65      23
     6 2   2      37      45
     7 3   3      65      67
     8 4   4      90      87
     9 5   5      20      34
    10 6   6      89      46
    11 7   7      94      87
    12 8   8      66      95
    13 9   9      62      43
    14 10 10      20      76
    15 11 11      20      23
    16 12 12      20      94
    17 #删除df第3行 ( df <- df[-3,] )
    18 > df.tmp <- df[-3,]
    19 > df.tmp
    20    ID Class Chinese Math English
    21 1   1     2      65   59      23
    22 2   2     2      37   38      45
    23 4   4     1      90   49      87
    24 5   5     2      20   71      34
    25 6   6     3      89   99      46
    26 7   7     1      94   38      87
    27 8   8     2      66   77      95
    28 9   9     3      62   93      43
    29 10 10     1      20   21      76
    30 11 11     2      20   65      23
    31 12 12     3      20   12      94

    五、添加

    1、添加行

    data.frame[新行号,] <- 行值

     1 > df[13,] <- c(13,2,62,19,38) #新增13行数据
     2 > df
     3    ID Class Chinese Math English
     4 1   1     2      65   59      23
     5 2   2     2      37   38      45
     6 3   3     3      65   76      67
     7 4   4     1      90   49      87
     8 5   5     2      20   71      34
     9 6   6     3      89   99      46
    10 7   7     1      94   38      87
    11 8   8     2      66   77      95
    12 9   9     3      62   93      43
    13 10 10     1      20   21      76
    14 11 11     2      20   65      23
    15 12 12     3      20   12      94
    16 13 13     2      62   19      38

    若想对行进行复制,可以采用重复行号的方法

     1 > df <- df[c(1,1:12),]      #复制第1行1次
     2 > df
     3     ID Class Chinese Math English
     4 1    1     2      65   59      23
     5 1.1  1     2      65   59      23
     6 2    2     2      37   38      45
     7 3    3     3      65   76      67
     8 4    4     1      90   49      87
     9 5    5     2      20   71      34
    10 6    6     3      89   99      46
    11 7    7     1      94   38      87
    12 8    8     2      66   77      95
    13 9    9     3      62   93      43
    14 10  10     1      20   21      76
    15 11  11     2      20   65      23
    16 12  12     3      20   12      94

    可使用rep()函数方便进行多行的复制

     1 > df <- df[rep(1:12,each = 2),]     #对每行数据复制1次
     2 > df
     3      ID Class Chinese Math English
     4 1     1     2      65   59      23
     5 1.1   1     2      65   59      23
     6 2     2     2      37   38      45
     7 2.1   2     2      37   38      45
     8 3     3     3      65   76      67
     9 3.1   3     3      65   76      67
    10 4     4     1      90   49      87
    11 4.1   4     1      90   49      87
    12 5     5     2      20   71      34
    13 5.1   5     2      20   71      34
    14 6     6     3      89   99      46
    15 6.1   6     3      89   99      46
    16 7     7     1      94   38      87
    17 7.1   7     1      94   38      87
    18 8     8     2      66   77      95
    19 8.1   8     2      66   77      95
    20 9     9     3      62   93      43
    21 9.1   9     3      62   93      43
    22 10   10     1      20   21      76
    23 10.1 10     1      20   21      76
    24 11   11     2      20   65      23
    25 11.1 11     2      20   65      23
    26 12   12     3      20   12      94
    27 12.1 12     3      20   12      94

    还可采用rbind()函数,后续会有示例

    2、添加列

    data.frame$新列名 <- 列值

     1 > df$Physics <- c(23,34,67,23,56,67,78,23,54,56,67,34)
     2 > df
     3    ID Class Chinese Math English Physics
     4 1   1     2      65   59      23      23
     5 2   2     2      37   38      45      34
     6 3   3     3      65   76      67      67
     7 4   4     1      90   49      87      23
     8 5   5     2      20   71      34      56
     9 6   6     3      89   99      46      67
    10 7   7     1      94   38      87      78
    11 8   8     2      66   77      95      23
    12 9   9     3      62   93      43      54
    13 10 10     1      20   21      76      56
    14 11 11     2      20   65      23      67
    15 12 12     3      20   12      94      34

    data.frame[,新列号] <- 列值

     1 > df[,7] <- c(1:12)
     2 > df
     3    ID Class Chinese Math English Physics V7
     4 1   1     2      65   59      23      23     1
     5 2   2     2      37   38      45      34     2
     6 3   3     3      65   76      67      67     3
     7 4   4     1      90   49      87      23     4
     8 5   5     2      20   71      34      56     5
     9 6   6     3      89   99      46      67     6
    10 7   7     1      94   38      87      78     7
    11 8   8     2      66   77      95      23     8
    12 9   9     3      62   93      43      54     9
    13 10 10     1      20   21      76      56    10
    14 11 11     2      20   65      23      67    11
    15 12 12     3      20   12      94      34    12

    还可用dplyr包中的mutate()函数

     1 > mutate(df,Chemistry = Chinese + Math + English + Physics)
     2    ID Class Chinese Math English Physics V7 Chemistry
     3 1   1     2      65   59      23      23      1       170
     4 2   2     2      37   38      45      34      2       154
     5 3   3     3      65   76      67      67      3       275
     6 4   4     1      90   49      87      23      4       249
     7 5   5     2      20   71      34      56      5       181
     8 6   6     3      89   99      46      67      6       301
     9 7   7     1      94   38      87      78      7       297
    10 8   8     2      66   77      95      23      8       261
    11 9   9     3      62   93      43      54      9       252
    12 10 10     1      20   21      76      56     10       173
    13 11 11     2      20   65      23      67     11       175
    14 12 12     3      20   12      94      34     12       160

    还可采用cbind()函数,后续会有示例

    六、dplyr包常用函数

     1 > df  #原数据
     2    ID Class Chinese Math English
     3 1   1     2      65   59      23
     4 2   2     2      37   38      45
     5 3   3     3      65   76      67
     6 4   4     1      90   49      87
     7 5   5     2      20   71      34
     8 6   6     3      89   99      46
     9 7   7     1      94   38      87
    10 8   8     2      66   77      95
    11 9   9     3      62   93      43
    12 10 10     1      20   21      76
    13 11 11     2      20   65      23
    14 12 12     3      20   12      94

    1、arrange() 排序

    arrange(.data, ...)

    arrange(.data, ..., .by_group = FALSE)

     1 > arrange(df,Chinese)  #按语文成绩由小到大排序
     2    ID Class Chinese Math English
     3 1   5     2      20   71      34
     4 2  10     1      20   21      76
     5 3  11     2      20   65      23
     6 4  12     3      20   12      94
     7 5   2     2      37   38      45
     8 6   9     3      62   93      43
     9 7   1     2      65   59      23
    10 8   3     3      65   76      67
    11 9   8     2      66   77      95
    12 10  6     3      89   99      46
    13 11  4     1      90   49      87
    14 12  7     1      94   38      87

    函数中第一个是待排序的数据框,之后依次是变量,且变量优先级逐渐降低,如语文、数学成绩进行排序

     1 > arrange(df,Chinese,Math)  #依次按语文、数学成绩由小到大排序
     2    ID Class Chinese Math English
     3 1  12     3      20   12      94
     4 2  10     1      20   21      76
     5 3  11     2      20   65      23
     6 4   5     2      20   71      34
     7 5   2     2      37   38      45
     8 6   9     3      62   93      43
     9 7   1     2      65   59      23
    10 8   3     3      65   76      67
    11 9   8     2      66   77      95
    12 10  6     3      89   99      46
    13 11  4     1      90   49      87
    14 12  7     1      94   38      87

    若想由大到小排序,使用desc()函数

     1 > arrange(df,desc(Chinese))  #按语文成绩由大到小排序
     2    ID Class Chinese Math English
     3 1   7     1      94   38      87
     4 2   4     1      90   49      87
     5 3   6     3      89   99      46
     6 4   8     2      66   77      95
     7 5   1     2      65   59      23
     8 6   3     3      65   76      67
     9 7   9     3      62   93      43
    10 8   2     2      37   38      45
    11 9   5     2      20   71      34
    12 10 10     1      20   21      76
    13 11 11     2      20   65      23
    14 12 12     3      20   12      94

    2、distinct()函数 去重

    distinct(.data, ..., .keep_all = FALSE)

     1 > df1 <- df[rep(1:nrow(df),each = 2),] #将df每行复制1次
     2 > df1
     3      ID Class Chinese Math English
     4 1     1     2      65   59      23
     5 1.1   1     2      65   59      23
     6 2     2     2      37   38      45
     7 2.1   2     2      37   38      45
     8 3     3     3      65   76      67
     9 3.1   3     3      65   76      67
    10 4     4     1      90   49      87
    11 4.1   4     1      90   49      87
    12 5     5     2      20   71      34
    13 5.1   5     2      20   71      34
    14 6     6     3      89   99      46
    15 6.1   6     3      89   99      46
    16 7     7     1      94   38      87
    17 7.1   7     1      94   38      87
    18 8     8     2      66   77      95
    19 8.1   8     2      66   77      95
    20 9     9     3      62   93      43
    21 9.1   9     3      62   93      43
    22 10   10     1      20   21      76
    23 10.1 10     1      20   21      76
    24 11   11     2      20   65      23
    25 11.1 11     2      20   65      23
    26 12   12     3      20   12      94
    27 12.1 12     3      20   12      94
    28 > df1 <- distinct(df1)  #去除重复的行
    29 > df1
    30    ID Class Chinese Math English
    31 1   1     2      65   59      23
    32 2   2     2      37   38      45
    33 3   3     3      65   76      67
    34 4   4     1      90   49      87
    35 5   5     2      20   71      34
    36 6   6     3      89   99      46
    37 7   7     1      94   38      87
    38 8   8     2      66   77      95
    39 9   9     3      62   93      43
    40 10 10     1      20   21      76
    41 11 11     2      20   65      23
    42 12 12     3      20   12      94

    3、group_by()函数 分组     summarise()函数 概括

    group_by(.data, ..., add = FALSE, .drop = FALSE)

    ungroup(x, ...)

    summarise(.data, ...)

    group_by()与summarise()函数常连用,用于对不同的分组进行操作,在这里再介绍一个管道函数“%>%”,其作用是把左件的值发送给右件的表达式,并作为右件表达式函数的第一个参数

    1 > df %>%
    2 +   group_by(Class) %>%
    3 +   summarise(max = max(Chinese)) #求出按Class分组每组中语文成绩最高分
    4 # A tibble: 3 x 2
    5   Class   max
    6   <dbl> <dbl>
    7 1     1    94
    8 2     2    66
    9 3     3    89

    4、filter()函数 筛选

    filter(.data, ..., .preserve = FALSE)

    选出符合条件的行(返回数据框格式)

     1 > df %>%
     2 +   group_by(Class) %>%
     3 +   filter(Chinese == max(Chinese))  #选出每个班语文成绩最高的学生的信息
     4 # A tibble: 3 x 5
     5 # Groups:   Class [3]
     6      ID Class Chinese  Math English
     7   <dbl> <dbl>   <dbl> <dbl>   <dbl>
     8 1     6     3      89    99      46
     9 2     7     1      94    38      87
    10 3     8     2      66    77      95

    5、select()函数 选择

    select(.data, ...)

     1 > select(df,ID,Chinese,Math,English) #选出df中ID、语文、数学、英语数据
     2    ID Chinese Math English
     3 1   1      65   59      23
     4 2   2      37   38      45
     5 3   3      65   76      67
     6 4   4      90   49      87
     7 5   5      20   71      34
     8 6   6      89   99      46
     9 7   7      94   38      87
    10 8   8      66   77      95
    11 9   9      62   93      43
    12 10 10      20   21      76
    13 11 11      20   65      23
    14 12 12      20   12      94

    6、rbind()函数与cbind()函数 合并

    rbind()函数根据行进行合并,cbind()根据列进行合并

     1 #新建数据框df1
     2 > df1 <- data.frame(ID = 13,Class = 2,
     3 Chinese = 65,Math = 26,English = 84)
     4 > df1
     5   ID Class Chinese Math English
     6 1 13     2      65   26      84
     7 > rbind(df,df1)  #合并df与df1
     8    ID Class Chinese Math English
     9 1   1     2      65   59      23
    10 2   2     2      37   38      45
    11 3   3     3      65   76      67
    12 4   4     1      90   49      87
    13 5   5     2      20   71      34
    14 6   6     3      89   99      46
    15 7   7     1      94   38      87
    16 8   8     2      66   77      95
    17 9   9     3      62   93      43
    18 10 10     1      20   21      76
    19 11 11     2      20   65      23
    20 12 12     3      20   12      94
    21 13 13     2      65   26      84
    22 > df2 #新建数据框df2
    23    Biological
    24 1          65
    25 2          15
    26 3          35
    27 4          59
    28 5          64
    29 6          34
    30 7          29
    31 8          46
    32 9          32
    33 10         95
    34 11         46
    35 12         23
    36 > cbind(df,df2)  #合并df与df2
    37    ID Class Chinese Math English Biological
    38 1   1     2      65   59      23         65
    39 2   2     2      37   38      45         15
    40 3   3     3      65   76      67         35
    41 4   4     1      90   49      87         59
    42 5   5     2      20   71      34         64
    43 6   6     3      89   99      46         34
    44 7   7     1      94   38      87         29
    45 8   8     2      66   77      95         46
    46 9   9     3      62   93      43         32
    47 10 10     1      20   21      76         95
    48 11 11     2      20   65      23         46
    49 12 12     3      20   12      94         23

    7、join函数 连接

    inner_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),...)

    left_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

    right_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"),...)

    full_join(x, y, by = NULL, copy = FALSE, suffix = c(".x", ".y"), ...)

    semi_join(x, y, by = NULL, copy = FALSE, ...)

    nest_join(x, y, by = NULL, copy = FALSE, keep = FALSE, name = NULL,...)

    anti_join(x, y, by = NULL, copy = FALSE, ...)

    join函数类型比较多,这里仅以left_join()函数举例

     1 #新建数据框Class
     2 > Class <- data.frame(Class = c(1,2,3),class = c('一班','二班','三班'))
     3 > Class
     4   Class class
     5 1     1  一班
     6 2     2  二班
     7 3     3  三班
     8 > left_join(df,Class,by = 'Class') #基于Class变量左连接df与Class数据框
     9    ID Class Chinese Math English class
    10 1   1     2      65   59      23    二班
    11 2   2     2      37   38      45    二班
    12 3   3     3      65   76      67    三班
    13 4   4     1      90   49      87    一班
    14 5   5     2      20   71      34    二班
    15 6   6     3      89   99      46    三班
    16 7   7     1      94   38      87    一班
    17 8   8     2      66   77      95    二班
    18 9   9     3      62   93      43    三班
    19 10 10     1      20   21      76    一班
    20 11 11     2      20   65      23    二班
    21 12 12     3      20   12      94    三班

    left_join()函数仅保留df对应的Class值的数据

    以上是关于data.frame数据框的一点学习总结,如有错误,敬请谅解。

  • 相关阅读:
    solr一些错误
    maven聚合工程之找不到符号,类等错误
    图片服务器搭建及上传测试,网络配置问题(errno: 111)
    安装Nginx,make时报错:/usr/bin/ld: cannot find -lfdfsclient或者类似找不到-lxxx
    关于PCA算法的学习
    生物信息及开发常用的Linux命令
    05.课程主页面三个接口开发
    04.增加media文件配置
    3.课程相关5张表设计
    2.增加抽象基类
  • 原文地址:https://www.cnblogs.com/huskysir/p/10841595.html
Copyright © 2011-2022 走看看