前言:近段時間學習R語言用到最多的數據格式就是data.frame,現對data.frame常用操作進行總結,其中函數大部分來自dplyr包,該包由Hadley Wickham所作,主要用於數據的清洗和整理。 一、創建 data.frame創建較為容易,調用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數據框的一點學習總結,如有錯誤,敬請諒解。