首先看看排序:
在R中,和排序相關(guān)的函數(shù)主要有三個(gè):sort()啰劲,rank()梁沧,order()。
sort(x)是對向量x進(jìn)行排序蝇裤,返回值排序后的數(shù)值向量廷支。
rank()是求秩的函數(shù),它的返回值是這個(gè)向量中對應(yīng)元素的“排名”栓辜。
order()的返回值是對應(yīng)“排名”的元素所在向量中的位置恋拍。
其中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,它可以用來給數(shù)據(jù)框進(jìn)行排序
dat[order(dat[,1]),] 以該數(shù)據(jù)框的第一列進(jìn)行排序
dat[order(dat[,1],dat[,2]),] 以該數(shù)據(jù)框的第一列為主要次序啃憎,第二列為次要序列進(jìn)行排序
然后我們看看集合運(yùn)算:
在R里面除了簡單的對兩個(gè)向量求交集并集補(bǔ)集之外芝囤,比較重要的就是match和 %in% 了,需要重點(diǎn)講講辛萍。
#首先對集合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
#檢驗(yàn)集合A,B是否相同
setequal(A,B)
[1] FALSE
#檢驗(yàn)元素12是否屬于集合C
is.element(12,C)
[1] FALSE
#檢驗(yàn)集合A是否包含C
all(C%in%A)
[1] TRUE
all(C%in%B)
從上面可以看到%in%這個(gè)操作符只返回邏輯向量TRUE 或者FALSE悯姊,而且返回值應(yīng)該與%in%這個(gè)操作符前面的向量程度相等。也就是說它相當(dāng)于遍歷了C里面的一個(gè)個(gè)元素贩毕,判斷它們是否在B中出現(xiàn)過悯许,然后返回是或者否即可。
而match(C,B)的結(jié)果就很不一樣了辉阶,它的返回結(jié)果同樣與前面的向量等長先壕,但是它并非返回邏輯向量瘩扼,而是遍歷了C里面的一個(gè)個(gè)元素,判斷它們是否在B中出現(xiàn)過垃僚,如果出現(xiàn)就返回在B中的索引號(hào)集绰,如果沒有出現(xiàn),就返回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:
這是一個(gè)需要安裝的包栽燕,起得就是R里面最經(jīng)典的把長型數(shù)據(jù)變寬,和把寬數(shù)據(jù)拉長的作用改淑。
其中melt函數(shù)是把很寬的數(shù)據(jù)拉長碍岔,它就是需要指定幾列數(shù)據(jù)是保證不被融合的, 其余每一列數(shù)據(jù)都必須被融合到一列了朵夏,融合后的這一列數(shù)據(jù)每個(gè)元素旁邊就用列名來標(biāo)記該數(shù)據(jù)來自于哪一列蔼啦。
[example of melt function](http://www.reibang.com/writer#example-of-melt-function)
library(reshape) mdata <- melt(mydata, id=c("id","time"))
融合后的數(shù)據(jù)如下:
id time variable value 1 1 x1 5 1 2 x1 3 2 1 x1 6 2 2 x1 2 1 1 x2 6 1 2 x2 5 2 1 x2 1 2 2 x2 4 可以看到variable列里面有兩個(gè)不同的元素,說明是把舊數(shù)據(jù)中的兩列給融合了仰猖,融合后的一個(gè)很長的列就是value
而cast函數(shù)的功能就是把剛才融合好的數(shù)據(jù)給還原捏肢。
[cast the melted data](http://www.reibang.com/writer#cast-the-melted-data)
[cast(data, formula, function)](http://www.reibang.com/writer#castdata-formula-function)
subjmeans <- cast(mdata, id~variable, mean) timemeans <- cast(mdata, time~variable, mean)
可以看到它們返回的結(jié)果是:
subjmeans
id x1 x2 1 4 5.5 2 4 2.5 timemeans
time x1 x2 1 5.5 3.5 2 2.5 4.5 可以看到cast函數(shù)比較復(fù)雜一點(diǎn),formula公式右邊的變量是需要拆開的variable亮元,這一列變量有多少不重復(fù)元素猛计,就新增多少列,左邊的變量是行標(biāo)記了爆捞,其余所有數(shù)據(jù)都會(huì)被計(jì)算一下再放在合適的位置奉瘤。
在reshape2這個(gè)包里面還進(jìn)化出來dcast和acast函數(shù),功能大同小異煮甥。
最后我們來看看merge函數(shù):
這個(gè)函數(shù)的功能非常強(qiáng)大盗温,類似于SQL語句里面的join系列函數(shù)
測試數(shù)據(jù)如下,它們這兩個(gè)表的連接是作者名
Capture1
如果要實(shí)現(xiàn)類似sql里面的inner join 功能成肘,則用代碼
m1 <- merge(authors, books, by.x = "surname", by.y = "name")
如果要實(shí)現(xiàn)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)
關(guān)于單變量匹配的總結(jié)就是這些卖局,但對于多變量匹配呢,例如下面兩個(gè)表双霍,需要對k1,k2兩個(gè)變量都相等的情況下匹配
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
另外一個(gè)多行匹配的例子如下:
Capture2
我們的測試數(shù)據(jù)如上砚偶,這兩個(gè)表的連接在于作者名。下面這兩個(gè)語句等價(jià)
merge(authors, books, by=1:2)
merge(authors, books, by.x=c("FirstName", "LastName"),
by.y=c("AuthorFirstName", "AuthorLastName"),
all.x=TRUE)
都可以把兩張表關(guān)聯(lián)起來洒闸。
當(dāng)然染坯,在我搜索資料的時(shí)候,發(fā)現(xiàn)了另外一個(gè)解決問題的方法:
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_6caea8bf0100spe9.html)
[http://blog.sina.com.cn/s/blog_6caea8bf010159dt.html](http://blog.sina.com.cn/s/blog_6caea8bf010159dt.html)
[http://blog.csdn.net/u014801157/article/details/24372441](http://blog.csdn.net/u014801157/article/details/24372441)
[http://www.statmethods.net/management/reshape.html](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](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://r.789695.n4.nabble.com/Matching-multiple-columns-in-a-data-frame-td890832.html)
[http://bbs.pinggu.org/thread-3234639-1-1.html](http://bbs.pinggu.org/thread-3234639-1-1.html)
[http://www.360doc.com/content/14/0821/13/18951041_403561544.shtml](http://www.360doc.com/content/14/0821/13/18951041_403561544.shtml)
[http://developer.51cto.com/art/201312/423612.htm](http://developer.51cto.com/art/201312/423612.htm)
* * *
自我嘗試
> 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)
> x
k1 k2 data
1 NA 1 1
2 NA NA 2
3 3 NA 3
4 4 4 4
5 5 5 5
> y
k1 k2 data
1 NA NA 1
2 2 NA 2
3 NA 3 3
4 4 4 4
5 5 5 5
> merge(x, y, by = c("k1","k2"))
k1 k2 data.x data.y
1 4 4 4 4
2 5 5 5 5
3 NA NA 2 1
> merge(x, y, by = c("k1","k2"),all=TRUE)
k1 k2 data.x data.y
1 2 NA NA 2
2 3 NA 3 NA
3 4 4 4 4
4 5 5 5 5
5 NA 1 1 NA
6 NA 3 NA 3
7 NA NA 2 1
> merge(x, y, by = c("k1","k2"),all.x =TRUE)
k1 k2 data.x data.y
1 3 NA 3 NA
2 4 4 4 4
3 5 5 5 5
4 NA 1 1 NA
5 NA NA 2 1
> melt(x, id=c("k1","k2"))
k1 k2 variable value
1 NA 1 data 1
2 NA NA data 2
3 3 NA data 3
4 4 4 data 4
5 5 5 data 5
> melt(x, id="k1")
k1 variable value
1 NA k2 1
2 NA k2 NA
3 3 k2 NA
4 4 k2 4
5 5 k2 5
6 NA data 1
7 NA data 2
8 3 data 3
9 4 data 4
10 5 data 5