R語(yǔ)言中data.frame的常用操作總結(jié)
前言:近段時(shí)間學(xué)習(xí)R語(yǔ)言用到最多的數(shù)據(jù)格式就是data.frame,現(xiàn)對(duì)data.frame常用操作進(jìn)行總結(jié),其中函數(shù)大部分來(lái)自dplyr包,該包由Hadley Wickham所作,主要用于數(shù)據(jù)的清洗和整理。
一、創(chuàng)建
data.frame創(chuàng)建較為容易,調(diào)用data.frame函數(shù)即可。本文創(chuàng)建一個(gè)關(guān)于學(xué)生成績(jī)的數(shù)據(jù)框,接下來(lái)大部分操作都對(duì)該數(shù)據(jù)框進(jìn)行,其中學(xué)生成績(jī)隨機(jī)產(chǎn)生
> library(dplyr) #導(dǎo)入dplyr包
> options(digits = 0) #保留整數(shù)
> set.seed(1) #設(shè)置種子函數(shù)
> df <- data.frame(ID = 1:12, #ID
+ Class = rep(c(1,2,3),4), #班級(jí)
+ Chinese = runif(12,min = 0,max = 100), #語(yǔ)文
+ Math = runif(12,min = 0,max = 100), #數(shù)學(xué)
+ English = runif(12,min = 0,max = 100)) #英語(yǔ)
> for (i in 1:ncol(df)) {
+ df[,i] <- as.integer(df[,i]) #將每列類(lèi)型變?yōu)閕nteger型
+ }
df結(jié)果如下
> df ID Class Chinese Math English 1 1 1 26 68 26 2 2 2 37 38 38 3 3 3 57 76 1 4 4 1 90 49 38 5 5 2 20 71 86 6 6 3 89 99 34 7 7 1 94 38 48 8 8 2 66 77 59 9 9 3 62 93 49 10 10 1 6 21 18 11 11 2 20 65 82 12 12 3 17 12 66
二、 查詢(xún)
1、查詢(xún)某一行或某一列
可通過(guò) data.frame[行號(hào),] 或者 data.frame[,列號(hào)] 操作完成
其中 data.frame[行號(hào),] 得到的類(lèi)型是數(shù)據(jù)框
而 data.frame[,列號(hào)] 得到的類(lèi)型是該列的類(lèi)型
> 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
查詢(xún)某一列還可以通過(guò) data.frame$列名 操作完成
> df$Chinese [1] 26 37 57 90 20 89 94 66 62 6 20 17
data.frame[列號(hào)] 得到一個(gè)僅包含該列內(nèi)容的數(shù)據(jù)框
> df[3] Chinese 1 26 2 37 3 57 4 90 5 20 6 89 7 94 8 66 9 62 10 6 11 20 12 17
若要查找符合條件的行,可采用 which() 函數(shù),得到的類(lèi)型是數(shù)據(jù)框
> df[which(df$ID == 4),] ID Class Chinese Math English 4 4 1 90 49 38
2、查詢(xún)某一個(gè)值
可通過(guò) data.frame[行號(hào),列號(hào)] 或 data.frame[行號(hào),‘列名'] 操作完成
> df[3,4] [1] 76 > df[3,'Math'] [1] 76
若查找符合條件的值,可采用 which() 函數(shù)
> df[which(df$Chinese == 57),'Math'] #查詢(xún)語(yǔ)文成績(jī)?yōu)?7的同學(xué)的數(shù)學(xué)成績(jī) [1] 76 > df[which(df$Class == 2),'English'] #查詢(xún)班級(jí)號(hào)為2的同學(xué)的英語(yǔ)成績(jī) [1] 38 86 59 82
三、修改
1、修改某一行或列
> df[1,] <- c(1,2,65,59,73) #修改第一行 #修改英語(yǔ)成績(jī) > df[,'English'] <- c(23,45,67,87,34,46,87,95,43,76,23,94)
修改后結(jié)果為(1號(hào)同學(xué)英語(yǔ)成績(jī)先由26修改為73,再修改為23)
> df ID Class Chinese Math English 1 1 2 65 59 23 2 2 2 37 38 45 3 3 3 57 76 67 4 4 1 90 49 87 5 5 2 20 71 34 6 6 3 89 99 46 7 7 1 94 38 87 8 8 2 66 77 95 9 9 3 62 93 43 10 10 1 6 21 76 11 11 2 20 65 23 12 12 3 17 12 94
2、修改某一個(gè)值
直接將需要修改后的值賦給上述查詢(xún)某一個(gè)值的操作即可
> df[3,'Chinese'] <- 65 #將3號(hào)同學(xué)的語(yǔ)文成績(jī)修改為65
#將語(yǔ)文成績(jī)低于20的同學(xué)的語(yǔ)文成績(jī)修改為20
> df[which(df$Chinese < 20),'Chinese'] <- 20
> df
ID Class Chinese Math English
1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 65 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
3、修改行列名
可用rownames()及colnames()得到數(shù)據(jù)框的行列名,rownames(data.frame)[行號(hào)] 或 colnames(data.frame)[列號(hào)] 可得到指定位置的行名或者列名,若修改直接賦值給該變量即可
> colnames(df) #查詢(xún)列名
[1] "ID" "Class" "Chinese" "Math" "English"
> colnames(df)[4] #查詢(xún)第4列列名
[1] "Math"
> colnames(df)[4] <- "math" #修改第4列列名為math
#修改列名
> colnames(df) <- c("ID","Class","Chinese","Math","English")
四、刪除
刪除行或列,僅需要選出該數(shù)據(jù)框的部分行或列,然后將其賦給該變量即可,其中在列號(hào)或行號(hào)前添加-表示不選該行或該列,在這里,為了方便接下來(lái)的操作,我們將選出后的數(shù)據(jù)框賦給其他變量,要實(shí)現(xiàn)刪除操作應(yīng)當(dāng)將選出后的數(shù)據(jù)框賦給自己
#選出df第1、3、5列 ( df <- df[,c(1,3,5)] ) > df.tmp <- df[,c(1,3,5)] > df.tmp ID Chinese English 1 1 65 23 2 2 37 45 3 3 65 67 4 4 90 87 5 5 20 34 6 6 89 46 7 7 94 87 8 8 66 95 9 9 62 43 10 10 20 76 11 11 20 23 12 12 20 94 #刪除df第3行 ( df <- df[-3,] ) > df.tmp <- df[-3,] > df.tmp ID Class Chinese Math English 1 1 2 65 59 23 2 2 2 37 38 45 4 4 1 90 49 87 5 5 2 20 71 34 6 6 3 89 99 46 7 7 1 94 38 87 8 8 2 66 77 95 9 9 3 62 93 43 10 10 1 20 21 76 11 11 2 20 65 23 12 12 3 20 12 94
五、添加
1、添加行
data.frame[新行號(hào),] <- 行值
> df[13,] <- c(13,2,62,19,38) #新增13行數(shù)據(jù) > df ID Class Chinese Math English 1 1 2 65 59 23 2 2 2 37 38 45 3 3 3 65 76 67 4 4 1 90 49 87 5 5 2 20 71 34 6 6 3 89 99 46 7 7 1 94 38 87 8 8 2 66 77 95 9 9 3 62 93 43 10 10 1 20 21 76 11 11 2 20 65 23 12 12 3 20 12 94 13 13 2 62 19 38
若想對(duì)行進(jìn)行復(fù)制,可以采用重復(fù)行號(hào)的方法
> df <- df[c(1,1:12),] #復(fù)制第1行1次
> df
ID Class Chinese Math English
1 1 2 65 59 23
1.1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 65 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
可使用rep()函數(shù)方便進(jìn)行多行的復(fù)制
> df <- df[rep(1:12,each = 2),] #對(duì)每行數(shù)據(jù)復(fù)制1次
> df
ID Class Chinese Math English
1 1 2 65 59 23
1.1 1 2 65 59 23
2 2 2 37 38 45
2.1 2 2 37 38 45
3 3 3 65 76 67
3.1 3 3 65 76 67
4 4 1 90 49 87
4.1 4 1 90 49 87
5 5 2 20 71 34
5.1 5 2 20 71 34
6 6 3 89 99 46
6.1 6 3 89 99 46
7 7 1 94 38 87
7.1 7 1 94 38 87
8 8 2 66 77 95
8.1 8 2 66 77 95
9 9 3 62 93 43
9.1 9 3 62 93 43
10 10 1 20 21 76
10.1 10 1 20 21 76
11 11 2 20 65 23
11.1 11 2 20 65 23
12 12 3 20 12 94
12.1 12 3 20 12 94
還可采用rbind()函數(shù),后續(xù)會(huì)有示例
2、添加列
data.frame$新列名 <- 列值
> df$Physics <- c(23,34,67,23,56,67,78,23,54,56,67,34) > df ID Class Chinese Math English Physics 1 1 2 65 59 23 23 2 2 2 37 38 45 34 3 3 3 65 76 67 67 4 4 1 90 49 87 23 5 5 2 20 71 34 56 6 6 3 89 99 46 67 7 7 1 94 38 87 78 8 8 2 66 77 95 23 9 9 3 62 93 43 54 10 10 1 20 21 76 56 11 11 2 20 65 23 67 12 12 3 20 12 94 34
data.frame[,新列號(hào)] <- 列值
> df[,7] <- c(1:12) > df ID Class Chinese Math English Physics V7 1 1 2 65 59 23 23 1 2 2 2 37 38 45 34 2 3 3 3 65 76 67 67 3 4 4 1 90 49 87 23 4 5 5 2 20 71 34 56 5 6 6 3 89 99 46 67 6 7 7 1 94 38 87 78 7 8 8 2 66 77 95 23 8 9 9 3 62 93 43 54 9 10 10 1 20 21 76 56 10 11 11 2 20 65 23 67 11 12 12 3 20 12 94 34 12
還可用dplyr包中的mutate()函數(shù)
> mutate(df,Chemistry = Chinese + Math + English + Physics) ID Class Chinese Math English Physics V7 Chemistry 1 1 2 65 59 23 23 1 170 2 2 2 37 38 45 34 2 154 3 3 3 65 76 67 67 3 275 4 4 1 90 49 87 23 4 249 5 5 2 20 71 34 56 5 181 6 6 3 89 99 46 67 6 301 7 7 1 94 38 87 78 7 297 8 8 2 66 77 95 23 8 261 9 9 3 62 93 43 54 9 252 10 10 1 20 21 76 56 10 173 11 11 2 20 65 23 67 11 175 12 12 3 20 12 94 34 12 160
還可采用cbind()函數(shù),后續(xù)會(huì)有示例
六、dplyr包常用函數(shù)
> df #原數(shù)據(jù) ID Class Chinese Math English 1 1 2 65 59 23 2 2 2 37 38 45 3 3 3 65 76 67 4 4 1 90 49 87 5 5 2 20 71 34 6 6 3 89 99 46 7 7 1 94 38 87 8 8 2 66 77 95 9 9 3 62 93 43 10 10 1 20 21 76 11 11 2 20 65 23 12 12 3 20 12 94
1、arrange() 排序
arrange(.data, ...) arrange(.data, ..., .by_group = FALSE)
> arrange(df,Chinese) #按語(yǔ)文成績(jī)由小到大排序 ID Class Chinese Math English 1 5 2 20 71 34 2 10 1 20 21 76 3 11 2 20 65 23 4 12 3 20 12 94 5 2 2 37 38 45 6 9 3 62 93 43 7 1 2 65 59 23 8 3 3 65 76 67 9 8 2 66 77 95 10 6 3 89 99 46 11 4 1 90 49 87 12 7 1 94 38 87
函數(shù)中第一個(gè)是待排序的數(shù)據(jù)框,之后依次是變量,且變量?jī)?yōu)先級(jí)逐漸降低,如語(yǔ)文、數(shù)學(xué)成績(jī)進(jìn)行排序
> arrange(df,Chinese,Math) #依次按語(yǔ)文、數(shù)學(xué)成績(jī)由小到大排序 ID Class Chinese Math English 1 12 3 20 12 94 2 10 1 20 21 76 3 11 2 20 65 23 4 5 2 20 71 34 5 2 2 37 38 45 6 9 3 62 93 43 7 1 2 65 59 23 8 3 3 65 76 67 9 8 2 66 77 95 10 6 3 89 99 46 11 4 1 90 49 87 12 7 1 94 38 87
若想由大到小排序,使用desc()函數(shù)
> arrange(df,desc(Chinese)) #按語(yǔ)文成績(jī)由大到小排序 ID Class Chinese Math English 1 7 1 94 38 87 2 4 1 90 49 87 3 6 3 89 99 46 4 8 2 66 77 95 5 1 2 65 59 23 6 3 3 65 76 67 7 9 3 62 93 43 8 2 2 37 38 45 9 5 2 20 71 34 10 10 1 20 21 76 11 11 2 20 65 23 12 12 3 20 12 94
2、distinct()函數(shù) 去重
distinct(.data, ..., .keep_all = FALSE)
> df1 <- df[rep(1:nrow(df),each = 2),] #將df每行復(fù)制1次
> df1
ID Class Chinese Math English
1 1 2 65 59 23
1.1 1 2 65 59 23
2 2 2 37 38 45
2.1 2 2 37 38 45
3 3 3 65 76 67
3.1 3 3 65 76 67
4 4 1 90 49 87
4.1 4 1 90 49 87
5 5 2 20 71 34
5.1 5 2 20 71 34
6 6 3 89 99 46
6.1 6 3 89 99 46
7 7 1 94 38 87
7.1 7 1 94 38 87
8 8 2 66 77 95
8.1 8 2 66 77 95
9 9 3 62 93 43
9.1 9 3 62 93 43
10 10 1 20 21 76
10.1 10 1 20 21 76
11 11 2 20 65 23
11.1 11 2 20 65 23
12 12 3 20 12 94
12.1 12 3 20 12 94
> df1 <- distinct(df1) #去除重復(fù)的行
> df1
ID Class Chinese Math English
1 1 2 65 59 23
2 2 2 37 38 45
3 3 3 65 76 67
4 4 1 90 49 87
5 5 2 20 71 34
6 6 3 89 99 46
7 7 1 94 38 87
8 8 2 66 77 95
9 9 3 62 93 43
10 10 1 20 21 76
11 11 2 20 65 23
12 12 3 20 12 94
3、group_by()函數(shù) 分組 summarise()函數(shù) 概括
group_by(.data, ..., add = FALSE, .drop = FALSE) ungroup(x, ...) summarise(.data, ...)
group_by()與summarise()函數(shù)常連用,用于對(duì)不同的分組進(jìn)行操作,在這里再介紹一個(gè)管道函數(shù)“%>%”,其作用是把左件的值發(fā)送給右件的表達(dá)式,并作為右件表達(dá)式函數(shù)的第一個(gè)參數(shù)
> df %>% + group_by(Class) %>% + summarise(max = max(Chinese)) #求出按Class分組每組中語(yǔ)文成績(jī)最高分 # A tibble: 3 x 2 Class max <dbl> <dbl> 1 1 94 2 2 66 3 3 89
4、filter()函數(shù) 篩選
filter(.data, ..., .preserve = FALSE)
選出符合條件的行(返回?cái)?shù)據(jù)框格式)
> df %>%
+ group_by(Class) %>%
+ filter(Chinese == max(Chinese)) #選出每個(gè)班語(yǔ)文成績(jī)最高的學(xué)生的信息
# A tibble: 3 x 5
# Groups: Class [3]
ID Class Chinese Math English
<dbl> <dbl> <dbl> <dbl> <dbl>
1 6 3 89 99 46
2 7 1 94 38 87
3 8 2 66 77 95
5、select()函數(shù) 選擇
select(.data, ...)
> select(df,ID,Chinese,Math,English) #選出df中ID、語(yǔ)文、數(shù)學(xué)、英語(yǔ)數(shù)據(jù) ID Chinese Math English 1 1 65 59 23 2 2 37 38 45 3 3 65 76 67 4 4 90 49 87 5 5 20 71 34 6 6 89 99 46 7 7 94 38 87 8 8 66 77 95 9 9 62 93 43 10 10 20 21 76 11 11 20 65 23 12 12 20 12 94
6、rbind()函數(shù)與cbind()函數(shù) 合并
rbind()函數(shù)根據(jù)行進(jìn)行合并,cbind()根據(jù)列進(jìn)行合并
#新建數(shù)據(jù)框df1 > df1 <- data.frame(ID = 13,Class = 2, Chinese = 65,Math = 26,English = 84) > df1 ID Class Chinese Math English 1 13 2 65 26 84 > rbind(df,df1) #合并df與df1 ID Class Chinese Math English 1 1 2 65 59 23 2 2 2 37 38 45 3 3 3 65 76 67 4 4 1 90 49 87 5 5 2 20 71 34 6 6 3 89 99 46 7 7 1 94 38 87 8 8 2 66 77 95 9 9 3 62 93 43 10 10 1 20 21 76 11 11 2 20 65 23 12 12 3 20 12 94 13 13 2 65 26 84 > df2 #新建數(shù)據(jù)框df2 Biological 1 65 2 15 3 35 4 59 5 64 6 34 7 29 8 46 9 32 10 95 11 46 12 23 > cbind(df,df2) #合并df與df2 ID Class Chinese Math English Biological 1 1 2 65 59 23 65 2 2 2 37 38 45 15 3 3 3 65 76 67 35 4 4 1 90 49 87 59 5 5 2 20 71 34 64 6 6 3 89 99 46 34 7 7 1 94 38 87 29 8 8 2 66 77 95 46 9 9 3 62 93 43 32 10 10 1 20 21 76 95 11 11 2 20 65 23 46 12 12 3 20 12 94 23
7、join函數(shù) 連接
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函數(shù)類(lèi)型比較多,這里僅以left_join()函數(shù)舉例
#新建數(shù)據(jù)框Class
> Class <- data.frame(Class = c(1,2,3),class = c('一班','二班','三班'))
> Class
Class class
1 1 一班
2 2 二班
3 3 三班
> left_join(df,Class,by = 'Class') #基于Class變量左連接df與Class數(shù)據(jù)框
ID Class Chinese Math English class
1 1 2 65 59 23 二班
2 2 2 37 38 45 二班
3 3 3 65 76 67 三班
4 4 1 90 49 87 一班
5 5 2 20 71 34 二班
6 6 3 89 99 46 三班
7 7 1 94 38 87 一班
8 8 2 66 77 95 二班
9 9 3 62 93 43 三班
10 10 1 20 21 76 一班
11 11 2 20 65 23 二班
12 12 3 20 12 94 三班
left_join()函數(shù)僅保留df對(duì)應(yīng)的Class值的數(shù)據(jù)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
使用R中merge()函數(shù)合并數(shù)據(jù)的方法
這篇文章主要介紹了使用R中merge()函數(shù)合并數(shù)據(jù),本文詳細(xì)介紹R中merge()函數(shù)參數(shù)及合并數(shù)據(jù)類(lèi)型,利用sql的表連接概念進(jìn)行類(lèi)比,簡(jiǎn)單易懂,需要的朋友可以參考下2023-03-03
解決R語(yǔ)言安裝時(shí)出現(xiàn)輯程包不存在的問(wèn)題
這篇文章主要介紹了解決R語(yǔ)言安裝時(shí)出現(xiàn)輯程包不存在的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
R語(yǔ)言對(duì)Web數(shù)據(jù)操作實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于R語(yǔ)言對(duì)Web數(shù)據(jù)操作實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05
用R語(yǔ)言實(shí)現(xiàn)霍夫曼編碼的示例代碼
這篇文章主要介紹了用R語(yǔ)言實(shí)現(xiàn)霍夫曼編碼的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
R語(yǔ)言實(shí)現(xiàn)PCA主成分分析圖的示例代碼
主成分分析(Principal?Component?Analysis,PCA)是一種無(wú)監(jiān)督的數(shù)據(jù)降維方法,通過(guò)主成分分析可以盡可能保留下具備區(qū)分性的低維數(shù)據(jù)特征。本文將用R語(yǔ)言實(shí)現(xiàn)PCA主成分分析圖,需要的可以參考一下2022-04-04
R語(yǔ)言繪圖時(shí)輸出希臘字符上下標(biāo)及數(shù)學(xué)公式實(shí)現(xiàn)方法
這篇文章主要為大家介紹了R語(yǔ)言進(jìn)行繪圖時(shí)輸出希臘字符上標(biāo),下標(biāo)及數(shù)學(xué)公式的實(shí)現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11
R語(yǔ)言時(shí)間序列知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于R語(yǔ)言時(shí)間序列知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-03-03
基于R語(yǔ)言賦值符號(hào)的區(qū)別說(shuō)明
這篇文章主要介紹了基于R語(yǔ)言賦值符號(hào)的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04

