R语言dataframe的常用操作总结

前言:近段时间学习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 English2  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数据框的一点学习总结,如有错误,敬请谅解。

原文地址:https://www.cnblogs.com/huskysir/p/10841595.html

时间: 2024-10-06 18:51:51

R语言dataframe的常用操作总结的相关文章

R语言文件相关的操作

1. 文件系统介绍 R语言对文件系统的操作,包括文件操作和目录操作,函数API都定义在base包中. 2. 目录操作 2.1 查看目录 查看当前目录下的子目录. # 启动R程序 ~ R # 当前的目录 > getwd() [1] "/home/conan/R/fs" # 查看当前目录的子目录 > list.dirs() [1] "." "./tmp" 查看当前目录的子目录和文件. > dir() [1] "readme

R语言进行文件夹操作示例(转)

rm(list=ls())path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'setwd(path)cat("file A\n", file="A") #创建一个文件A,文件内容是'file A','\n'表示换行,这是一个很好的习惯cat("file B\n", file="B")  #创建一个文件Bfile.append("A", "B")  #将文件B的内容附

R语言量化投资常用包总结

前言 总是被很多的人问,为什么用R语言做量化投资,R.Python.Matlab比起来哪个更好?其实,答案很简单,你哪个用的熟就用哪个,工具是用来提升效率的,结果才是你会得到的.认准一门语言,坚持把它做好你就会成长. 每个领域,每种编程语言都用推动它前进的人,跟上牛人的脚步,你慢慢地也会变牛. 目录 为什么用R语言做量化投资? 常用量化投资工具包 完整文章:http://blog.fens.me/r-quant-packages/

R语言︱情感分析文本操作技巧汇总(打标签、词典与数据匹配等)

笔者寄语:情感分析中对文本处理的数据的小技巧要求比较高,笔者在学习时候会为一些小技巧感到头疼不已. 主要包括以下内容: 1.批量读取txt字符文件(导入.文本内容逐行读取.加入文档名字). 2.文本清洗(一级清洗,去标点:二级清洗去内容:三级清洗,去停用词) 3.词典之间匹配(有主键join.词库匹配%in%) 4.分词之后档案id+label的加入 5.情感打分(关联情感词join.情感分数aggerate.情感偏向) -------------------------------------

【sparkSQL】DataFrame的常用操作

scala> import org.apache.spark.sql.SparkSession import org.apache.spark.sql.SparkSession scala> val spark=SparkSession.builder().getOrCreate() spark: org.apache.spark.sql.SparkSession = [email protected] //使支持RDDs转换为DataFrames及后续sql操作 scala> impo

R | R语言表达式中常用的符号

符号 用途 ~ 分隔符号,左边为响应变量,右边为解释变量,eg:要通过x.z和w预测y,代码为y~x+z+w + 分隔预测变量 : 表示预测变量的交互项 eg:要通过x.z及x与z的交互项预测y,代码为y~x+z+x:z * 表示所有可能交互项的简洁方式,代码y~x*z*w可展开为y~x+z+w+x:z+x:w+z:w+x:z:w ^ 表示交互项达到某个次数,代码y~(x+z+w)^2可展开为y~x+z+w+x:z+x:w+z:w . 表示包含除因变量外的所有变量,eg:若一个数据框包含变量x.

R语言之词云:wordcloud&amp;wordcloud2安装及参数说明

一.wordcloud安装说明 install.packages("wordcloud"); 二.wordcloud2安装说明 install.packages("devtools"); devtools::install_github("lchiffon/wordcloud2",type="source") 错误提示: 解决办法: install.packages("htmltools"); 三.word

R语言用nls做非线性回归以及函数模型的参数估计

非线性回归是在对变量的非线性关系有一定认识前提下,对非线性函数的参数进行最优化的过程,最优化后的参数会使得模型的RSS(残差平方和)达到最小.在R语言中最为常用的非线性回归建模函数是nls,下面以car包中的USPop数据集为例来讲解其用法.数据中population表示人口数,year表示年份.如果将二者绘制散点图可以发现它们之间的非线性关系.在建立非线性回归模型时需要事先确定两件事,一个是非线性函数形式,另一个是参数初始值. 一.模型拟合 对于人口模型可以采用Logistic增长函数形式,它

Windows7-32位系统下R语言链接mySQL数据库步骤

安装R和MySQL在此就不再多说了,网上有很多教程可以找到.下面直接进入到odbc的安装流程. 1.下载安装mysql-connector-odbc-5.x.x-win32.msi 下载地址:http://dev.mysql.com/downloads/connector/odbc/可下载最新版本 但在安装过程中遇到以下问题(经测试win10-64位版本下安装mysql-connector-odbc-5.3.6-winx64.msi不会出现该问题): Error 1918. Error inst