R語言中的排序,集合運算,reshape,以及merge總結

2021-02-23 生信技能樹

不想排版,心情也不好,但是這個知識點很重要,尤其是學習R語言的朋友,請仔細看~

一直以來我都是隨便看了點R的編程教程,因為我學了一點點C,所以還算有基礎,現在基本上簡單看看教程就能懂一門語言了,區別只是熟練度而已。R用得比較多,所以還算擅長,但是很多快捷應用的地方,我總是寄希望於到時候再查資料,所以沒能用心的記住,這次花了點時間好好整理了一下R裡面關於數據操作的重點,我想,以後再碰到類似的數據處理要求,應該很快能解決了把。

首先看看排序:

在R中,和排序相關的函數主要有三個:sort(),rank(),order()。

sort(x)是對向量x進行排序,返回值排序後的數值向量。

rank()是求秩的函數,它的返回值是這個向量中對應元素的「排名」。

order()的返回值是對應「排名」的元素所在向量中的位置。

其中sort(x)等同於x[order(x)]

下面以一小段R代碼來舉例說明:

> x<-c(97,93,85,74,32,100,99,67)

> sort(x)

[1]  32  67  74  85  93  97  99 100

> order(x)

[1] 5 8 4 3 2 1 7 6

> rank(x)

[1] 6 5 4 3 1 8 7 2

> x[order(x)]

[1]  32  67  74  85  93  97  99 100

其中比較有用的order,它可以用來給數據框進行排序

dat[order(dat[,1]),] 以該數據框的第一列進行排序

dat[order(dat[,1],dat[,2]),] 以該數據框的第一列為主要次序,第二列為次要序列進行排序

 

然後我們看看集合運算:

在R裡面除了簡單的對兩個向量求交集併集補集之外,比較重要的就是match和 %in% 了,需要重點講講。

#首先對集合A,B,C賦值

> A<-1:10

> B<-seq(5,15,2)

> C<-1:5

> #求A和B的併集

> union(A,B)

[1]  1  2  3  4  5  6  7  8  9 10 11 13 15

> #求A和B的交集

> intersect(A,B)

[1] 5 7 9

> #求A-B

> setdiff(A,B)

[1]  1  2  3  4  6  8 10

> #求B-A

> setdiff(B,A)

[1] 11 13 15

> #檢驗集合A,B是否相同

> setequal(A,B)

[1] FALSE

> #檢驗元素12是否屬於集合C

> is.element(12,C)

[1] FALSE

> #檢驗集合A是否包含C

> all(C%in%A)

[1] TRUE

> all(C%in%B)

從上面可以看到%in%這個操作符只返回邏輯向量TRUE 或者FALSE,而且返回值應該與%in%這個操作符前面的向量程度相等。也就是說它相當於遍歷了C裡面的一個個元素,判斷它們是否在B中出現過,然後返回是或者否即可。

而match(C,B)的結果就很不一樣了,它的返回結果同樣與前面的向量等長,但是它並非返回邏輯向量,而是遍歷了C裡面的一個個元素,判斷它們是否在B中出現過,如果出現就返回在B中的索引號,如果沒有出現,就返回NA

>B

[1]  5  7  9 11 13 15

>C

[1] 1 2 3 4 5

>match(C,B)

[1] NA NA NA NA  1

>C%in%B

[1] FALSE FALSE FALSE FALSE  TRUE

 接下來我們看看reshape:

這是一個需要安裝的包,起得就是R裡面最經典的把長型數據變寬,和把寬數據拉長的作用。

其中melt函數是把很寬的數據拉長,它就是需要指定幾列數據是保證不被融合的, 其餘每一列數據都必須被融合到一列了,融合後的這一列數據每個元素旁邊就用列名來標記該數據來自於哪一列。

# example of melt function
library(reshape)
mdata <- melt(mydata, id=c("id","time"))

融合後的數據如下:

idtimevariablevalue11x1512x1321x1622x1211x2612x2521x2122x24

可以看到variable列裡面有兩個不同的元素,說明是把舊數據中的兩列給融合了,融合後的一個很長的列就是value

而cast函數的功能就是把剛才融合好的數據給還原。

# cast the melted data
# cast(data, formula, function)
subjmeans <- cast(mdata, id~variable, mean)
timemeans <- cast(mdata, time~variable, mean)

可以看到它們返回的結果是:

subjmeans

timemeans

可以看到cast函數比較複雜一點,formula公式右邊的變量是需要拆開的variable,這一列變量有多少不重複元素,就新增多少列,左邊的變量是行標記了,其餘所有數據都會被計算一下再放在合適的位置。

在reshape2這個包裡面還進化出來dcast和acast函數,功能大同小異。

 

最後我們來看看merge函數:

這個函數的功能非常強大,類似於SQL語句裡面的join系列函數

測試數據如下,它們這兩個表的連接是作者名

 

如果要實現類似sql裡面的inner join 功能,則用代碼

m1 <- merge(authors, books, by.x = "surname", by.y = "name")

如果要實現left join功能則用代碼

m1 <- merge(authors, books, by.x = "surname", by.y = "name",all.x=TRUE)

right join功能代碼

m1 <- merge(authors, books, by.x = "surname", by.y = "name",all.y=TRUE)

all join功能代碼

m1 <- merge(authors, books, by.x = "surname", by.y = "name",all=TRUE)

關於單變量匹配的總結就是這些,但對於多變量匹配呢,例如下面兩個表,需要對k1,k2兩個變量都相等的情況下匹配

x <- data.frame(k1 = c(NA,NA,3,4,5), k2 = c(1,NA,NA,4,5), data = 1:5)

y <- data.frame(k1 = c(NA,2,NA,4,5), k2 = c(NA,NA,3,4,5), data = 1:5)

匹配代碼如下merge(x, y, by = c("k1","k2"))  #inner join

另外一個多行匹配的例子如下:

我們的測試數據如上,這兩個表的連接在於作者名。下面這兩個語句等價

merge(authors, books, by=1:2)

merge(authors, books, by.x=c("FirstName", "LastName"),

by.y=c("AuthorFirstName", "AuthorLastName"),

all.x=TRUE)

都可以把兩張表關聯起來。

當然,在我搜索資料的時候,發現了另外一個解決問題的方法:

A[with(A, paste(C1, C2, sep = "\r")) %in% with(B, paste(C1, C2, sep="\r")), ]

 

 

參考:http://blog.sina.com.cn/s/blog_6caea8bf0100spe9.html

http://blog.sina.com.cn/s/blog_6caea8bf010159dt.html

http://blog.csdn.net/u014801157/article/details/24372441

http://www.statmethods.net/management/reshape.html

https://docs.tibco.com/pub/enterprise-runtime-for-R/1.5.0_may_2013/TERR_1.5.0_LanguageRef/base/merge.html

http://r.789695.n4.nabble.com/Matching-multiple-columns-in-a-data-frame-td890832.html

http://bbs.pinggu.org/thread-3234639-1-1.html

http://www.360doc.com/content/14/0821/13/18951041_403561544.shtml

http://developer.51cto.com/art/201312/423612.htm

相關焦點

  • R語言入門筆記·數據·排序與長寬型轉換
    編者按:   1、 加粗為代碼,藍色字體為解釋   2、無>且有[1]則後面為r輸出的結果
  • R語言數據處理方法~小結
    1.6 匹配合併 mergemerge效果同dplyr的join,join的效力更高。(1)inner_join 等價於 merge(all=F)(2)left_join 等價於 merge(all.x=T, all.y=F)(3)right_join 等價於 merge(all.x=F, all.y=T)(4)full_join 等價於 merge(all=T)
  • R語言常用數據處理代碼整理
    在收集好臨床數據,經過初步處理後,就可以導入到R軟體中去。R在進行統計分析前,常常需要對數據進行處理,使數據結構符合我們的統計需要,比如說變量因子化、創建新變量、變量類型轉化等等,因此數據處理是R進行統計分析前很重要的步驟。現基於各類R語言入門書整理R中常見的數據處理代碼。
  • 不要在循環體中使用 array_merge ()
    標題是不要在循環體中使用 array_merge(),其實這只是本篇文章的結論之一下面我們一起研究一下 php 語言中數組的合併
  • 力扣(LeetCode)- 常見的排序算法總結
    常見的排序算法總結4. 排序算法原理描述冒泡排序移動相鄰位置的兩個數據,重複執行。插入排序把數組分為兩個區間,已排序和未排序區間。把數據從未排序區間插入已排序區間的合適位置。選擇排序分已排序和未排序區間,從未排序中找到最小的元素,放到已排序區間的額末尾。原地排序、不穩定排序、最好最壞平均時間複雜度都是O(n2)。
  • reshape命令一文讀懂!
    數據處理-reshape命令一文讀懂。對於第一點優勢,官方給的建議是當你在處理較大的數據,而 reshape 命令又需要等待很久時,你可以考慮採用 sreshape 命令,速度大概能快4-5倍左右,這個可以留給大家自己去試一下(語法命令與reshape完全一致)。
  • R語言中plyr包
    文章轉載自哈爾濱商業大學銀河統計工作室前言  apply族函數是R語言中很有特色的一類函數,包括了apply、sapply、lapply、tapply
  • 用 python 實現各種排序算法
    我們工作到底為了什麼(這篇文章很重要)總結了一下常見集中排序的算法, first, last):      ''''' merge sort    merge_sort函數中傳遞的是下標,不是元素個數    '''      if first < last:          middle = (first + last)/2          merge_sort(nums
  • python 數據清洗之數據合併、轉換、過濾、排序
    數據合併在pandas中可以通過merge對數據進行合併操作。兩個數據框中如果列名不同的情況下,我們可以通過指定letf_on 和right_on兩個參數把數據連接在一起print(pd.merge(data3,data4,left_on='level1',right_on
  • LeetCode-23.合併K個排序鍊表(Merge k Sorted Lists)
    這是前面Merge Two Sorted Lists的一個follow-up排序超大數量級的數據,可以分成N個機器分別排序
  • 程式設計師必備的幾種常見排序算法和搜索算法總結
    .在真實項目中我們往往不會採用冒泡排序,更多的會用快速排序或者希爾排序.關於排序算法性能問題我在《前端算法系列》如何讓前端代碼速度提高60倍有詳細介紹.我們深入分析代碼就可以知道兩層for循環排序導致了很多多餘的排序,如果我們從內循環減去外循環中已跑過的輪數,就可以避免內循環中不必要的比較,所以我們代碼優化如下:// 冒泡排序優化版bubbleSort(arr = []) {let len = arr.length
  • 八大排序算法的 Python 實現
    low, left - 1) quick_sort(lists, left + 1, high) return lists5、直接選擇排序基本思想:第1趟,在待排序記錄r1 ~ r[n]中選出最小的記錄,將它與r1交換;第2趟,在待排序記錄r2 ~ r[n]中選出最小的記錄,將它與r2交換;以此類推,第i趟在待排序記錄r[i] ~ r
  • 技術貼 | R語言:組學關聯分析和pheatmap可視化
    舉例展示R語言組學關聯分析的方法。宏基因組數據以KO-樣品豐度表為例。代謝組數據以metabolite-樣品豐度表為例。基本方法是用R語言psych包corr.test函數進行兩組數據的相關分析,結果經格式化後用pheatmap可視化得熱圖。一、模擬輸入 1.
  • R語言:Merge(數據框橫向合併)
    數據框2:student1 <- data.frame(ID=c(2,4,6),ability=c(4,7,6))student1  ID  ability1  2       42  4       73  6       6幾種不同類型的橫向合併:mstu <- merge
  • Merge k Sorted Lists
    請你將所有鍊表合併到一個升序鍊表中,返回合併後的鍊表。我們用 N表示鍊表的總長度,考慮最壞情況,k 個鍊表的長度相等,都為 n 。解法一 暴力破解簡單粗暴,遍歷所有的鍊表,將數字存到一個數組裡,然後用快速排序,最後再將排序好的數組存到一個鍊表裡。
  • Python中的合併排序算法,合併排序的優缺點,中級python技術點
    Python中的合併排序算法合併排序是一種非常有效的排序算法。它基於分治法,這是一種用於解決複雜問題的強大算法技術。為了正確理解分治法,您應該首先了解遞歸的概念。遞歸涉及將問題分解成較小的子問題,直到它們足夠小以至於無法解決。在編程中,遞歸通常由調用自身的函數表示。
  • ...選擇,插入,希爾,歸併,快排,堆排序,計數排序,桶排序,基數排序)
    ;外排序:由於數據很大,因此把數據放在磁碟中,排序通過磁碟和內存的數據傳輸才能進行。,我們可以每一趟排序中進行正向和反向兩遍冒泡,一次可以得到兩個最終值(最大和最小),從而是排序趟數減少了一半。(圖片來源網絡):總結:最佳情況:O(nlog2n)最壞情況:O(nlog2n)平均情況:O(nlogn)六、歸併排序(merge sort)
  • C語言八大排序算法,附動圖和詳細代碼解釋!
    ElemType *rf, int i, int m, int n){ int j,k; for(j=m+1,k=i; i<=m && j <=n ; ++k){ if(r[j] < r[i]) rf[k] = r[j++]; else rf[k] = r[i++]; } while(i <= m) rf[k++] = r[i++];
  • R語言-data.table-數據處理
    j 常規計算by 分組新增或刪除更新列排序行篩選data.table包中特殊符號常用函數排序函數 frank判斷函數交集 差集 合併連接透視表功能運用自定義函數計算帶匯總的聚合運算行列轉變前言官方關於data.table包的介紹請參閱:https://cran.r-project.org
  • R語言實現幾種經典排序算法
    插入排序        有一個已經有序的數據序列,要求在這個已經排好的數據序列中插入一個數,但要求插入後此數據序列仍然有序,這個時候就要用到一種新的排序方法——插入排序法,插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用於少量數據的排序,時間複雜度為O(n^2)。是穩定的排序方法。