16.1 簡介
減少重復(fù)代碼的方式一個(gè)是前面所提及的function功能一個(gè)是進(jìn)行迭代計(jì)算
關(guān)于減少重復(fù)代碼的好處我就不細(xì)談了焦影,書上已經(jīng)寫得非常清楚了。
- 明意圖
- 便修改
- 少bug
本章將使用命令編程中的for循環(huán)和while循環(huán)對代碼進(jìn)行修改和提取玫膀。
for循環(huán)
for循環(huán)主要應(yīng)用的索引
這個(gè)索引我認(rèn)為就是位置矛缨,就跟目錄頁的書頁號一樣!
每個(gè) for 循環(huán)都包括 3 個(gè)部分帖旨。
輸出:output <- vector("double", length(x)) 這就是先給你輸出的結(jié)果分配一個(gè)倉庫箕昭,等一會結(jié)果出來了就直接懟進(jìn)去!當(dāng)然了倉庫類型也不同 大小也不同解阅。當(dāng)然你也可以不指定倉庫的類型落竹。
序列:i in seq_along(df) 這就是有多少個(gè)要進(jìn)行加工的貨啊货抄!
循環(huán)體 output[] <- median(df[])就是加工的過程是啥呀述召!出來的東西要進(jìn)倉庫了!
帶著做一個(gè)練習(xí)題吧
Compute the mean of every column in mtcars
str(mtcars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
head(mtcars)
mpg cyl disp hp drat wt qsec
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02
Datsun 710 22.8 4 108 93 3.85 2.320 18.61
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02
Valiant 18.1 6 225 105 2.76 3.460 20.22
vs am gear carb
Mazda RX4 0 1 4 4
Mazda RX4 Wag 0 1 4 4
Datsun 710 1 1 4 1
Hornet 4 Drive 1 0 3 1
Hornet Sportabout 0 0 3 2
Valiant 1 0 3 1
output <- vector("double", ncol(mtcars))
names(output) <- names(mtcars)
for (i in names(mtcars)) {**這塊要注意 如果你用seq_along返回的是帶字符型數(shù)值的數(shù)據(jù) 不能計(jì)算哦蟹地!**
output[i] <- mean(mtcars[[i]])
}
output
#
for循環(huán)變體
修改現(xiàn)有對象(觀測值)
df <- tibble(
a = rnorm(10),
b = rnorm(10),
c = rnorm(10),
d = rnorm(10)
)
rescale01 <- function(x) {
rng <- range(x, na.rm = TRUE)
(x - rng[1]) / (rng[2] - rng[1])
}
df$a <- rescale01(df$a)
df$b <- rescale01(df$b)
df$c <- rescale01(df$c)
df$d <- rescale01(df$d)
for (i in seq_along(df)) {
df[[i]] <- rescale01(df[[i]])
}
練習(xí)1中讀取CSV文件 在批量提取測序數(shù)據(jù)的相同基因的表達(dá)值時(shí)用的到
df <- vector("list", length(files))
for (fname in seq_along(files)) {
df[[i]] <- read_csv(files[[i]])
}
df <- bind_rows(df)
for循環(huán)與函數(shù)式編程
重點(diǎn)說一下apply()积暖,lapply(),tapply()等函數(shù)
- Apply Functions Over Array Margins Returns a vector or array or list of values obtained by applying a function to margins of an array or matrix.
apply(df,2,mean) #其中的2表示列 具體解釋如下:給出將應(yīng)用該函數(shù)的下標(biāo)的向量怪与。 例如夺刑,矩陣1表示行,2表示列分别,c(1,2)表示行和列性誉。 其中X命名為dimnames,它可以是選擇維名稱的字符向量茎杂。
等價(jià)于
output <- vector("double", length(df))
for (i in seq_along(df)) {
output[i] <- mean(df[[i]])
}
output
- lapply返回一個(gè)與X相同長度的列表错览,其中每個(gè)元素都是將FUN應(yīng)用于X的相應(yīng)元素的結(jié)果。
> lapply(df, mean)
$`a`
[1] -0.4432281
$b
[1] -0.1124617
$c
[1] 0.2448539
$d
[1] -0.03413569
class(lapply(df,mean))
[1] "list"
- sapply是一個(gè)用戶友好的版本和lapply的包裝器煌往,默認(rèn)情況下通過應(yīng)用
class(sapply(x, mean))
simplify2array()返回一個(gè)向量倾哺,矩陣,或者刽脖,如果需要羞海,則更新一個(gè)數(shù)組(如果合適)。 sapply(x曲管,f却邓,simplify = FALSE,USE.NAMES = FALSE)與lapply(x院水,f)相同腊徙。
vapply類似于sapply简十,但具有預(yù)先指定類型的返回值,因此它可以更安全(有時(shí)更快)使用撬腾。
replicate是一個(gè)常用的sapply包裝器螟蝙,用于重復(fù)評估表達(dá)式(通常涉及隨機(jī)數(shù)生成)。
simplify2array()是當(dāng)simple不為false并且從mapply()類似地調(diào)用時(shí)從sapply()調(diào)用的實(shí)用程序民傻。