大家好,這里 【生信擺渡】。
兩個(gè)變量取交集
眾所周知,在R中,兩個(gè)變量取交集可以使用intersect函數(shù):
# 兩個(gè)變量取交集
string1 = letters
string2 = strsplit("Hello, bioinfobaidu!", "")[[1]]
intersect(string1, string2)
# [1] "a" "b" "d" "e" "f" "i" "l" "n" "o" "u"
隨著輸入變量增多,書(shū)寫(xiě)起來(lái)會(huì)逐漸麻煩,因?yàn)?code>intersect只能接受兩個(gè)變量。
結(jié)果就會(huì)形成套娃的樣子,比如四個(gè)變量取交集:
# 四個(gè)變量取交集
string1 = letters
string2 = strsplit("Hello, bioinfobaidu!", "")[[1]]
string3 = strsplit("wo zui niu bi", "")[[1]]
string4 = strsplit("wo shi sha bi", "")[[1]]
intersect(string1, intersect(string2, intersect(string3, string4)))
# [1] "b" "i" "o"
非常不方便。
那么我來(lái)10個(gè)變量,閣下又如何應(yīng)對(duì)?
生成10個(gè)數(shù)字集合:
# 生成10個(gè)數(shù)字集合
for(i in 1:10){
var_name = paste0("var", i)
set.seed(i)
nums = sample(1:100, 80)
assign(var_name, nums)
}
多個(gè)變量取交集
遇到這種需要逐個(gè)計(jì)算的,交給Reduce函數(shù)就行了。
使用Reduce函數(shù)可以大大減少代碼量和提高代碼美觀性,可以用一個(gè)美字來(lái)形容。早就想介紹了,這次先拋磚引玉不展開(kāi),下次再重點(diǎn)介紹!
Reduce函數(shù)接受兩個(gè)變量,一個(gè)是處理方法,也就是函數(shù),這個(gè)函數(shù)必須是二元函數(shù)。
另一個(gè)參數(shù)是列表或者是向量,對(duì)列表內(nèi)的元素逐個(gè)進(jìn)行累計(jì)二元運(yùn)算,就是先將前兩個(gè)元素進(jìn)行運(yùn)算,之后將結(jié)果與第三個(gè)元素進(jìn)行運(yùn)算,以此類(lèi)推。
這完美符合我們的需求好吧~
比如四個(gè)變量:
Reduce(intersect, list(string1, string2, string3, string4))
# [1] "b" "i" "o"
至少在美觀上,簡(jiǎn)單了許多。
而對(duì)于變量名有規(guī)律的情況來(lái)說(shuō),不管多少變量,只需要短短的一行代碼。
比如上面的10個(gè)變量:
Reduce(intersect, lapply(paste0("var", 1:10), get))
# [1] 87 59 21 84 42 24 18 76 16
甚至,我們可以編寫(xiě)一個(gè)新的函數(shù)intersect2來(lái)進(jìn)一步簡(jiǎn)化這一過(guò)程。
intersect2
intersect2 <- function(...) Reduce(intersect, list(...))
這里用到了三個(gè)點(diǎn)...來(lái)接受要輸入的變量,你想輸入幾個(gè)就輸入幾個(gè),用逗號(hào),隔開(kāi)就行,非常方便。
試試:
intersect2(string1, string2, string3, string4)
# [1] "b" "i" "o"
一個(gè)字,妙~~啊
學(xué)習(xí)生信知識(shí),請(qǐng)持續(xù)關(guān)注 【生信擺渡】。