R語言-Reduce函數(shù) 讓你的代碼優(yōu)美且強(qiáng)大

獲取更好閱讀體驗(yàn):R語言-Reduce函數(shù) 讓你的代碼優(yōu)美且強(qiáng)大川队。

一邻奠、摘要

上篇推文介紹了如何快速對多個(gè)變量取交集:R語言-快速對多個(gè)變量取交集蒂誉,最終用到了Reduce函數(shù)税弃。

本文將專門介紹Reduce函數(shù)地絕妙之處刀荒,讓你的代碼簡短而強(qiáng)大。

在R語言數(shù)據(jù)處理的過程中暇唾,我們經(jīng)常需要對不同類型的數(shù)據(jù)進(jìn)行聚合条摸、累積或歸約操作。Reduce函數(shù)是R語言中一個(gè)強(qiáng)大的工具覆旭,能夠?qū)⒁粋€(gè)序列的元素逐步減少為單個(gè)結(jié)果退子。本文將帶您深入探索Reduce函數(shù)的技巧與竅門,助您在處理數(shù)字型将、字符寂祥、數(shù)據(jù)框、列表等不同類型的數(shù)據(jù)時(shí)事半功倍七兜。

二丸凭、參數(shù)解釋

在使用Reduce()函數(shù)時(shí),我們需要了解以下關(guān)鍵參數(shù)的含義:

  • f:這是一個(gè)二元函數(shù)腕铸,用于指定如何將序列中的元素逐步減少為單個(gè)結(jié)果贮乳。函數(shù)f接受兩個(gè)參數(shù),第一個(gè)參數(shù)是前一個(gè)累積值恬惯,第二個(gè)參數(shù)是下一個(gè)元素向拆。

  • x:這是一個(gè)序列,可以是向量酪耳、列表浓恳、矩陣、數(shù)據(jù)框或其他可迭代的數(shù)據(jù)結(jié)構(gòu)碗暗。Reduce()函數(shù)將按順序處理序列中的元素颈将,并將每個(gè)元素傳遞給函數(shù)f進(jìn)行累積計(jì)算。

  • init(可選):這是Reduce()函數(shù)的初始累積值言疗。如果未提供init參數(shù)晴圾,則默認(rèn)使用序列中的第一個(gè)元素作為初始累積值。

  • right(可選噪奄,默認(rèn)為FALSE):這是一個(gè)邏輯值死姚,用于指定累積計(jì)算的方向。如果rightFALSE(默認(rèn)值)勤篮,則Reduce()函數(shù)從左到右按順序處理序列中的元素都毒。

  • accumulate(可選,默認(rèn)為FALSE):這也是一個(gè)邏輯值碰缔,用于指定是否返回中間累積結(jié)果的向量账劲。如果accumulateFALSE(默認(rèn)值),則Reduce()函數(shù)僅返回最終的累積結(jié)果。

三瀑焦、使用示例

下面展示Reduce函數(shù)在實(shí)際數(shù)據(jù)處理中的用法腌且,大家舉一反三,觀察其使用場景以靈活運(yùn)用榛瓮。

1. 多個(gè)變量取交集

就是上個(gè)推文介紹的:

# 生成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)
}

Reduce(intersect, lapply(paste0("var", 1:10), get))
# [1] 87 59 21 84 42 24 18 76 16

2. 多個(gè)數(shù)據(jù)框合并

for循環(huán)中切蟋,經(jīng)常會(huì)遇到每個(gè)循環(huán)生成一個(gè)數(shù)據(jù)框,你可以先把每個(gè)循環(huán)的數(shù)據(jù)框保存在列表里榆芦,再使用Reduce進(jìn)行合并。

resL = list()
for(i in 1:5){
    from = 1 + 10 * i
    to = from + 2
    resL[[i]] = iris[from:to, ]
}
resT = Reduce(rbind, resL)
#    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 11          5.4         3.7          1.5         0.2     setosa
# 12          4.8         3.4          1.6         0.2     setosa
# 13          4.8         3.0          1.4         0.1     setosa
# 21          5.4         3.4          1.7         0.2     setosa
# 22          5.1         3.7          1.5         0.4     setosa
# 23          4.6         3.6          1.0         0.2     setosa
# 31          4.8         3.1          1.6         0.2     setosa
# 32          5.4         3.4          1.5         0.4     setosa
# 33          5.2         4.1          1.5         0.1     setosa
# 41          5.0         3.5          1.3         0.3     setosa
# 42          4.5         2.3          1.3         0.3     setosa
# 43          4.4         3.2          1.3         0.2     setosa
# 51          7.0         3.2          4.7         1.4 versicolor
# 52          6.4         3.2          4.5         1.5 versicolor
# 53          6.9         3.1          4.9         1.5 versicolor

3. 合并單細(xì)胞樣本

# https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE146170
# 獲取每個(gè)樣本的細(xì)胞注釋文件路徑
anno_file = lf("rf", "00_raw/anno")

# lapply批量讀取, 并使用Reduce合并
anno_tb = Reduce(rbind, lapply(anno_file, function(x) data.table::fread(x, data.table = FALSE)))

# 獲取每個(gè)樣本的表達(dá)矩陣文件路徑
umi_file = lf("rf", "00_raw/UMI")

# lapply批量讀取
umi_list = lapply(umi_file, function(x) data.table::fread(x, data.table = FALSE))

# 使用Reduce合并
umi_tb = Reduce(function(df1, df2) merge(df1, df2, by = "gene_name", all = TRUE), umi_list)

# 首列轉(zhuǎn)為行名
umi_tb = col2rownames(umi_tb, remove = TRUE)

# 構(gòu)建Seurat對象
loadp(Seurat)
obj = CreateSeuratObject(counts = umi_tb, meta.data = anno_tb)
obj

可以看到喘鸟,結(jié)合lappy家族匆绣,代碼更為簡潔高效,因?yàn)楹笳咻敵龅慕Y(jié)果正可以作為前者的輸入什黑。

4. 處理單個(gè)數(shù)據(jù)框

  • 直接合并每個(gè)元素
tb = cars[1:5, ]
Reduce(c, tb)
# [1]  4  4  7  7  8  2 10  4 22 16
  • 其實(shí)unlist也可以崎淳,沒想到吧,數(shù)據(jù)框其實(shí)也是列表愕把,一種特殊的列表(使用typeof函數(shù)可以看出)
unlist(tb)
# speed1 speed2 speed3 speed4 speed5  dist1  dist2  dist3  dist4  dist5 
#      4      4      7      7      8      2     10      4     22     1

5. 累加

  • 如何使用R語言計(jì)算1到100的和拣凹?
Reduce(`+`, 1:100)
# [1] 5050

例子是舉不完的,大家要靈活使用恨豁。

Reduce函數(shù)是不是很優(yōu)美和強(qiáng)大嚣镜!


學(xué)習(xí)更多生信技巧,持續(xù)關(guān)注【生信擺渡】橘蜜!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菊匿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子计福,更是在濱河造成了極大的恐慌跌捆,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件象颖,死亡現(xiàn)場離奇詭異佩厚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)说订,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門抄瓦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陶冷,你說我怎么就攤上這事闺鲸。” “怎么了埃叭?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵摸恍,是天一觀的道長。 經(jīng)常有香客問我,道長立镶,這世上最難降的妖魔是什么壁袄? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮媚媒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缭召。我一直安慰自己栈顷,他們只是感情好嵌巷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搪哪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晓折。 梳的紋絲不亂的頭發(fā)上惑朦,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天漾月,我揣著相機(jī)與錄音,去河邊找鬼胃珍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛堂鲜,可吹牛的內(nèi)容都是我干的栈雳。 我是一名探鬼主播缔莲,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痴奏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起读拆,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎檐晕,沒想到半個(gè)月后暑诸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡个榕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年篡石,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片西采。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凰萨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出械馆,到底是詐尸還是另有隱情胖眷,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布霹崎,位于F島的核電站珊搀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仿畸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一朗和、第九天 我趴在偏房一處隱蔽的房頂上張望错沽。 院中可真熱鬧,春花似錦眶拉、人聲如沸千埃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽放可。三九已至,卻和暖如春朝刊,著一層夾襖步出監(jiān)牢的瞬間耀里,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工拾氓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冯挎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓咙鞍,卻偏偏與公主長得像房官,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子续滋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容