原始數據(raw dataset)->預處理后的數據(clean dataset) 基本方法: - []:提取一個或多個類型相同的元素 -[[]]:從列表或者數據框中提取元素 -$:按名字從列表或數據框中提取元素
。
(1)
//向量的子集> x <- 1:10> x[1][1] 1> x[5][1] 5> x[1:5][1] 1 2 3 4 5> x[x>5][1] 6 7 8 9 10> x>5 [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE> x[x>5 & x<7][1] 6> x[x<3 | x>7][1] 1 2 8 9 10> y <- 1:4> y[1] 1 2 3 4> names(y) <- c("a","b","c","d")> ya b c d 1 2 3 4 > y[2]b 2 > y["b"]b 2 > //矩陣的子集> x <- matrix(1:6, nrow = 2, ncol = 3)> x [,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6> x[1,2] //拿一個元素[1] 3> x[1,] //拿一行元素[1] 1 3 5> x[,1] //拿一列元素[1] 1 2> x[2,c(1,3)][1] 2 6> class(x[1,2])[1] "integer"> x[1,2, drop = FALSE] //將拿出的元素仍為矩陣類型的 [,1][1,] 3//數據框的子集> data.frame(v1=1:5, v2=6:10, v3=11:15) v1 v2 v31 1 6 112 2 7 123 3 8 134 4 9 145 5 10 15> x$v3[c(2,4)] <- NA> x v1 v2 v31 1 6 112 2 7 NA3 3 8 134 4 9 NA5 5 10 15> x[,2][1] 6 7 8 9 10> x[,"v2"][1] 6 7 8 9 10> x[(x$v1<4 & x$v2>=8),] v1 v2 v33 3 8 13> x[(x$v1<4 | x$v2>=8),] v1 v2 v31 1 6 112 2 7 NA3 3 8 134 4 9 NA5 5 10 15> x[x$v1>2,] v1 v2 v33 3 8 134 4 9 NA5 5 10 15> x[which(x$v1>2),] v1 v2 v33 3 8 134 4 9 NA5 5 10 15> which(x$v1>2)[1] 3 4 5> x$v1>2[1] FALSE FALSE TRUE TRUE TRUE> subset(x,x$v1>2) v1 v2 v33 3 8 134 4 9 NA5 5 10 15.(2)列表的子集
[[]] /$ / [[]][] / [[]][[]]嵌套列表/不完全匹配(partial matching)> x <- list(id = 1:4, height = 170, gender = "male")//創建一個列表> x$id[1] 1 2 3 4$height[1] 170$gender[1] "male"> x[1]//取列表中的第一個元素$id[1] 1 2 3 4> x["id"]$id[1] 1 2 3 4//只取第一個元素的內容> x[[1]][1] 1 2 3 4> x[["id"]][1] 1 2 3 4> x$id[1] 1 2 3 4> > x[c(1,3)]//取列表中的第一個和第三個元素$id[1] 1 2 3 4$gender[1] "male"> > y <- "id"> x[["id"]][1] 1 2 3 4> x[[y]]//通過y來指代[1] 1 2 3 4> > > x$id[1] 1 2 3 4> x$y//這種方法不適用NULL> > x <- list(a=list(1,2,3,4), b=c("Monday","Tuesday"))//嵌套列表> x$a$a[[1]][1] 1$a[[2]][1] 2$a[[3]][1] 3$a[[4]][1] 4$b[1] "Monday" "Tuesday"> x[[1]][[1]][1] 1[[2]][1] 2[[3]][1] 3[[4]][1] 4> x[[1]][[2]]//第一個里面的第二個元素內容[1] 2> x[[1]][2]//第一個元素的第二個元素[[1]][1] 2> > > x[[c(1,3)]]//第一個里面的第三個[1] 3> x[[c(2,2)]][1] "Tuesday"> > > //不完全匹配> l <- list(sddfg = 1:10)> l$sddfg [1] 1 2 3 4 5 6 7 8 9 10> l$sddfg [1] 1 2 3 4 5 6 7 8 9 10> l$aNULL> l$s [1] 1 2 3 4 5 6 7 8 9 10> l[["s", exact = FALSE]] [1] 1 2 3 4 5 6 7 8 9 10(3)如何處理缺失值(missing value)
> x <- c(1, NA, 2, NA, 3)> is.na(x)[1] FALSE TRUE FALSE TRUE FALSE> x[!is.na(x)][1] 1 2 3> x <- c(1, NA, 2, NA, 3)> y <- c("a","b",NA,"c",NA)> z <- complete.cases(x,y)//x,y都不是缺失值得元素> z[1] TRUE FALSE FALSE FALSE FALSE> > x[z]//分別查看x和y中不是缺失值得值[1] 1> y[z][1] "a"> library(datasets)//加載一個數據集> head(airquality)//查看數據集的前6行 Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 18 313 11.5 62 5 45 NA NA 14.3 56 5 56 28 NA 14.9 66 5 6> g <- complete.cases(airquality)//查看缺失值> g [1] TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE [13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE [25] FALSE FALSE FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE [37] FALSE TRUE FALSE TRUE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE [49] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [61] FALSE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE [73] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE [85] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE [97] FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE TRUE TRUE FALSE TRUE[109] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE[121] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE[133] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE[145] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE> airquality[g,][1:10,]//選擇數據集中不存在缺失值的行,列全要;查看1到10行,列全要。 Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 18 313 11.5 62 5 47 23 299 8.6 65 5 78 19 99 13.8 59 5 89 8 19 20.1 61 5 912 16 256 9.7 69 5 1213 11 290 9.2 66 5 1314 14 274 10.9 68 5 14(4)向量化操作
——可以作用于向量、矩陣等結構,使得代碼簡潔,易于閱讀、效率高
向量矩陣的加減乘除都是針對每個元素的,即就是每個對應元素做加減乘除,如果想計算真正的矩陣乘法時,使用這個符號%*%
(1)循環 - R不僅有for/while循環語句,還有更強大的實現循環的“一句話”函數:
lapply:lapply可以循環處理列表中的每一個元素lapply(參數):lapply(列表,函數/函數名,其他參數)總是返回一個列表
sapply:簡化結果
(1)結果列表元素長度均為1,返回向量(2)結果列表元素長度相同且大于1,返回矩陣x <- list(a=1:10, b=c(11,21,31,41,51))xlapply(x,mean)x <- 1:4lapply(x, runif)lapply(x, runif, min=0, max=100)x <- list(a=matrix(1:6,2,3), b=matrix(4:7,2,2))lapply(x, function(m) m[1,])#sapplyx <- list(a=1:10, b=c(11,21,31,41,51))xlapply(x,mean)sapply(x,mean)//執行步驟:> str(lapply)//查看一個函數的標準化function (X, FUN, ...) > x <- list(a=1:10, b=c(11,21,31,41,51))> x$a [1] 1 2 3 4 5 6 7 8 9 10$b[1] 11 21 31 41 51> lapply(x,mean)$a[1] 5.5$b[1] 31> x <- 1:4> lapply(x, runif)//runif取隨機數[[1]][1] 0.8024411[[2]][1] 0.3922546 0.6929949[[3]][1] 0.64910476 0.06124001 0.45324513[[4]][1] 0.01928596 0.86259091 0.67297106 0.98231294> lapply(x, runif, min=0, max=100)[[1]][1] 34.09794[[2]][1] 20.99846 45.18515[[3]][1] 19.148935 81.885369 5.879639[[4]][1] 18.60201 53.44052 27.06450 15.64718> x <- list(a=matrix(1:6,2,3), b=matrix(4:7,2,2))> lapply(x, function(m) m[1,])//自定義函數,求矩陣的第一行$a[1] 1 3 5$b[1] 4 6> #sapply//簡化結果> x <- list(a=1:10, b=c(11,21,31,41,51))> x$a [1] 1 2 3 4 5 6 7 8 9 10$b[1] 11 21 31 41 51> lapply(x,mean)$a[1] 5.5$b[1] 31> sapply(x,mean) a b 5.5 31.0 > class(sapply(x,mean))[1] "numeric"apply:沿著數組的某一維度處理數據(1)例如:將函數用于矩陣的行或者列(2)雖然與for/while循環的效率相似,但是只用一句話就可以完成apply(參數):apply(數組,維度,函數/函數名)x <- matrix(1:16,4,4)> x [,1] [,2] [,3] [,4][1,] 1 5 9 13[2,] 2 6 10 14[3,] 3 7 11 15[4,] 4 8 12 16> apply(x,2,mean)//2代表列[1] 2.5 6.5 10.5 14.5> apply(x,2,sum)[1] 10 26 42 58> sumfunction (..., na.rm = FALSE) .(2)排序 - sort: - 對向量進行排序;返回排好序的內容 - order - 返回排好序的內容的下標/多個排序標準x <- data.frame(v1=1:5, v2=c(10,7,9,6,8), v3=11:15, v4=c(1,1,2,2,1))x#對數據框中v2進行排序sort(x$v2)sort(x$v2, decreasing = TRUE)order(x$v2)x[order(x$v2),]#先對v4進行排序,如果遇到兩個一樣的元素,再按v2進行排序x[order(x$v4,x$v2),]x[order(x$v4,x$v2,decreasing = TRUE),]//執行步驟:> x <- data.frame(v1=1:5, v2=c(10,7,9,6,8), v3=11:15, v4=c(1,1,2,2,1))> x v1 v2 v3 v41 1 10 11 12 2 7 12 13 3 9 13 24 4 6 14 25 5 8 15 1> sort(x$v2)[1] 6 7 8 9 10> sort(x$v2, decreasing = TRUE)[1] 10 9 8 7 6> order(x$v2)[1] 4 2 5 3 1> x[order(x$v2),] v1 v2 v3 v44 4 6 14 22 2 7 12 15 5 8 15 13 3 9 13 21 1 10 11 1> x[order(x$v4,x$v2),] v1 v2 v3 v42 2 7 12 15 5 8 15 11 1 10 11 14 4 6 14 23 3 9 13 2> x[order(x$v4,x$v2,decreasing = TRUE),] v1 v2 v3 v43 3 9 13 24 4 6 14 21 1 10 11 15 5 8 15 12 2 7 12 1(3)總結數據信息
#查看前六行head(airquality)#看后六行tail(airquality)#自定義行數head(airquality,10)summary(airquality)str(airquality)table(airquality$Month)table(airquality$Ozone, useNA = "ifany")table(airquality$Month,airquality$Day)#判斷是否有缺失值any(is.na(airquality$Ozone))sum(is.na(airquality$Ozone))#判斷月份是不是都小于12all(airquality$Month<12)#新的一個數據titanic <- as.data.frame(Titanic)head(titanic)dim(titanic)summary(titanic)#一個新的表x <- xtabs(Freq ~ Class + Age, data=titanic)ftable(x)#了解我們的數據有多大object.size(airquality)print(object.size(airquality), units = "Kb")//執行步驟> #查看前六行> head(airquality) Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 18 313 11.5 62 5 45 NA NA 14.3 56 5 56 28 NA 14.9 66 5 6> #看后六行> tail(airquality) Ozone Solar.R Wind Temp Month Day148 14 20 16.6 63 9 25149 30 193 6.9 70 9 26150 NA 145 13.2 77 9 27151 14 191 14.3 75 9 28152 18 131 8.0 76 9 29153 20 223 11.5 68 9 30> head(airquality,10) Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 18 313 11.5 62 5 45 NA NA 14.3 56 5 56 28 NA 14.9 66 5 67 23 299 8.6 65 5 78 19 99 13.8 59 5 89 8 19 20.1 61 5 910 NA 194 8.6 69 5 10> summary(airquality) Ozone Solar.R Wind Temp Min. : 1.00 Min. : 7.0 Min. : 1.700 Min. :56.00 1st Qu.: 18.00 1st Qu.:115.8 1st Qu.: 7.400 1st Qu.:72.00 Median : 31.50 Median :205.0 Median : 9.700 Median :79.00 Mean : 42.13 Mean :185.9 Mean : 9.958 Mean :77.88 3rd Qu.: 63.25 3rd Qu.:258.8 3rd Qu.:11.500 3rd Qu.:85.00 Max. :168.00 Max. :334.0 Max. :20.700 Max. :97.00 NA's :37 NA's :7 Month Day Min. :5.000 Min. : 1.0 1st Qu.:6.000 1st Qu.: 8.0 Median :7.000 Median :16.0 Mean :6.993 Mean :15.8 3rd Qu.:8.000 3rd Qu.:23.0 Max. :9.000 Max. :31.0 > str(airquality)'data.frame': 153 obs. of 6 variables: $ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ... $ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ... $ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ... $ Temp : int 67 72 74 62 56 66 65 59 61 69 ... $ Month : int 5 5 5 5 5 5 5 5 5 5 ... $ Day : int 1 2 3 4 5 6 7 8 9 10 ...> table(airquality$Month) 5 6 7 8 9 31 30 31 31 30 > table(airquality$Ozone) 1 4 6 7 8 9 10 11 12 13 14 16 18 19 20 21 22 23 24 27 1 1 1 3 1 3 1 3 2 4 4 4 4 1 4 4 1 6 2 1 28 29 30 31 32 34 35 36 37 39 40 41 44 45 46 47 48 49 50 52 3 1 2 1 3 1 2 2 2 2 1 1 3 2 1 1 1 1 1 1 59 61 63 64 65 66 71 73 76 77 78 79 80 82 84 85 89 91 96 97 2 1 1 2 1 1 1 2 1 1 2 1 1 1 1 2 1 1 1 2 108 110 115 118 122 135 168 1 1 1 1 1 1 1 > table(airquality$Ozone, useNA = "ifany") 1 4 6 7 8 9 10 11 12 13 14 16 18 19 20 21 1 1 1 3 1 3 1 3 2 4 4 4 4 1 4 4 22 23 24 27 28 29 30 31 32 34 35 36 37 39 40 41 1 6 2 1 3 1 2 1 3 1 2 2 2 2 1 1 44 45 46 47 48 49 50 52 59 61 63 64 65 66 71 73 3 2 1 1 1 1 1 1 2 1 1 2 1 1 1 2 76 77 78 79 80 82 84 85 89 91 96 97 108 110 115 118 1 1 2 1 1 1 1 2 1 1 1 2 1 1 1 1 122 135 168 <NA> 1 1 1 37 > table(airquality$Month,airquality$Day) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 6 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 9 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 29 30 31 5 1 1 1 6 1 1 0 7 1 1 1 8 1 1 1 9 1 1 0> any(is,na(airquality$Ozone))Error: could not find function "na"> any(is.na(airquality$Ozone))[1] TRUE> sum(is.na(airquality$Ozone))[1] 37> all(airquality$Month<12)[1] TRUE> #新的一個數據> titanic <- as.data.frame(Titanic)> head(titanic) Class Sex Age Survived Freq1 1st Male Child No 02 2nd Male Child No 03 3rd Male Child No 354 Crew Male Child No 05 1st Female Child No 06 2nd Female Child No 0> dim(titanic)[1] 32 5> summary(titanic) Class Sex Age Survived Freq 1st :8 Male :16 Child:16 No :16 Min. : 0.00 2nd :8 Female:16 Adult:16 Yes:16 1st Qu.: 0.75 3rd :8 Median : 13.50 Crew:8 Mean : 68.78 3rd Qu.: 77.00 Max. :670.00 > > > #一個新的表> xtabs(Freq ~ Class + Age, data=titanic) AgeClass Child Adult 1st 6 319 2nd 24 261 3rd 79 627 Crew 0 885> x <- xtabs(Freq ~ Class + Age, data=titanic)> ftable(x) Age Child AdultClass 1st 6 3192nd 24 2613rd 79 627Crew 0 885> object.size(airquality)5496 bytes> print(object.size(airquality), units = "Kb")5.4 Kb
新聞熱點
疑難解答