经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » R语言 » 查看文章
R语言dataframe的常用操作总结
来源:cnblogs  作者:HuskySir  时间:2019/5/10 9:03:28  对本文有异议

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

一、创建

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

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

df结果如下

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

二、 查询

1、查询某一行或某一列

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

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

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

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

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

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

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

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

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

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

2、查询某一个值

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

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

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

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

三、修改

1、修改某一行或列

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

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

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

2、修改某一个值

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

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

3、修改行列名

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

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

四、删除

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

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

五、添加

1、添加行

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

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

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

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

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

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

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

2、添加列

data.frame$新列名 <- 列值

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

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

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

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

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

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

六、dplyr包常用函数

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

1、arrange() 排序

arrange(.data, ...)

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

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

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

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

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

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

2、distinct()函数 去重

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

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

4、filter()函数 筛选

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

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

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

5、select()函数 选择

select(.data, ...)

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

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

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

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

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

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

原文链接:http://www.cnblogs.com/huskysir/p/10841595.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号