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  7
6      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  7
6      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      3
7      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      6
5  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      6
5  59      23
5 1.1  1    2      65  59      23
6 2    2    2      3
7  3
8      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      6
5  59      23
5 1.1  1    2      65  59      23
6 2    2    2      3
7  3
8      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、添加列
html framedata.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      6
5  59      23      23
5 2  2    2      37  38      45      34
6 3  3    3      65  76      6
7      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      6
5  59      23      23    1
5 2  2    2      37  38      45      34    2
6 3  3    3      65  76      6
7      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      4
5      34      2      154
5 3  3    3      65  7
6      6
7      67      3      275
6 4  4    1      90  49      8
7      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  7
6      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      9
4  38      87
4 2  4    1      90  49      87
5 3
6    3      89  99      46
6 4  8    2      66  7
7      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      6
5  59      23
5 1.1  1    2      65  59      23
6 2    2    2      3
7  3
8      45
7 2.1  2    2      37  38      45
8 3    3    3      65  76      67
9 3.1  3    3      65  76      67

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。