1. 程式人生 > >R語言資料集合並、資料增減、不等長合併

R語言資料集合並、資料增減、不等長合併

每每以為攀得眾山小,可、每每又切實來到起點,大牛們,緩緩腳步來俺筆記葩分享一下吧,please~

———————————————————————————


資料選取與簡單操作:

which返回一個向量中指定元素的索引
which.max返回最大元素的索引
which.min返回最小元素的索引
sample隨機在向量中抽取元素
subset根據條件選取元素
sort升序排列元素
rev反轉所有元素
order獲取排序後的索引
table返回頻數表
cut將資料分割為幾部分
split按照指定條件分割資料
rbind行合併
cbind列合併
merge按照指定列合併矩陣或者資料框

一、資料合併

1、merge()函式

最常用merge()函式,但是這個函式使用時候這兩種情況需要注意:

1、merge(a,b),純粹地把兩個資料集合在一起,沒有溝通a、b資料集的by,這樣出現的資料很多,相當於a*b條資料;

2、merge函式是匹配到a,b資料集的並,都有的才匹配出來,如果a、b資料集ID不同,要用all=T(下面有all用法的程式碼)。

#橫向合併
ID<-c(1,2,3,4)
name<-c("Jim","Tony","Lisa","Tom")
score<-c(89,22,78,78)
student1<-data.frame(ID,name)
student2<-data.frame(ID,score)
total_student<-merge(student1,student2,by="ID")  #或者rbind()
total_student
#縱向合併
ID<-c(1,2,3)
name<-c("Jame","Kevin","Sunny")
student1<-data.frame(ID,name)
ID<-c(4,5,6)
name<-c("Sun","Frame","Eric")
student2<-data.frame(ID,name)
total<-cbind(student1,student2)
total

merge的all用法

> id=c("1","2","3")
> M=c("7","2","3")
> ink2=data.frame(id,M)
> 
> merge(ink1,ink2,by="id",all=T)  #所有資料列都放進來,空缺的補值為NA
  id    R    M
1  1    9    7
2  2    7    2
3  4    9 <NA>
4  3 <NA>    3
> merge(ink1,ink2,by="id",all=F)  #預設,只取兩者的共有的部分
  id R M
1  1 9 7
2  2 7 2
其中,all=T代表全連線,all.x=T代表左聯結;all.y=T代表右連線

2、dplyr包

dplyr包的資料合併,

一般用left_join(x,y,by="name")  以x為主,y中匹配到的都放進來, 但,y中沒有的則不放過來。

需要這個x資料集是全集,比較大。



生成一長串字元向量。

paste(c("X","Y"),1:10,sep="")      #"X”,"Y"是長度為2的字元向量,1:10 長度為10的向量。命令是讓這兩個向量粘合在一起生成新的字串向量,粘合後的新字元之間沒有間隔。
#—————————paste中seq與collapse區別————————————————————
a = c(1, 2, 3, 4, 5)
names(a) = c('m', 'n','o', 'p', 'q')
# 主要是區分使用sep和collapse
b = paste(a, names(a), sep = "/")          #不同向量合併在一起,但是還是各自向量
c = paste(b, collapse = ",")               #不同向量合併在一起,但是變成一個向量
mode(b) #變數型別
mode(c)

4、cbind和rbind函式

cbind()和rbind(),cbind()按照縱向方向,或者說按列的方式將矩陣連線到一起。

rbind()按照橫向的方向,或者說按行的方式將矩陣連線到一起

rbind/cbind對資料合併的要求比較嚴格:合併的變數名必須一致;資料等長;指標順序必須一致。相比來說,其他一些方法要好一些,有dplyr,sqldf中的union

5、sqldf包

利用SQL語句來寫,進行資料合併,適合資料庫熟悉的人,可參考: 

二、資料增減

x=x[,-1]  #這個就代表,刪除了x資料集中第一列資料

或用dplyr包中的mutate函式
a=mutate(Hdma_dat,dou=2*survived,dou4=4*survived) 
Hdma_dat$dou=a$dou
Hdma_dat$dou4=a$dou4   #兩個新序列,加入到Hdma資料集彙總

篩選變數服從某值的子集

subset(airquality, Temp > 80, select = c(Ozone, Temp))
subset(airquality, Day == 1, select = -Temp)
subset(airquality, select = Ozone:Wind)

三、資料縱橫加總

R使用rowSums函式對行求和,使用colSums函式對列求和。

四、不等長合併

1、plyr包

rbind.fill函式可以很好將資料進行合併,並且補齊沒有匹配到的缺失值為NA。

#————————————————————————————不等長合併
#如何解決合併時資料不等長問題——兩種方法:do.call函式以及rbind.fill函式(plyr包)
#rbind.fill函式只能合併資料框格式
#do.call函式在資料框中執行函式(函式,資料列)
library("plyr")  #載入獲取rbind.fill函式
#第一種方法
list1<-list()
list1[[1]]=data.frame(t(data.frame(Job_Pwordseg.ct[1])))
list1[[2]]=data.frame(t(data.frame(Job_Pwordseg.ct[2])))
do.call(rbind.fill,list1)
#第二種方法
u=rbind.fill(data.frame(t(data.frame(Job_Pwordseg.ct[1]))),data.frame(t(data.frame(Job_Pwordseg.ct[2]))))
核心函式是plyr包中的rbind.fill函式(合併的資料,必須是data.frame),do.call可以用來批量執行。(do.call用法

關於do.call其他用法(R語言 函式do.call()使用 )

有一個list,想把裡面的所有元素相加求和。發現了兩個很有意思的函式

list <- list(matrix(1:25, ncol = 5), matrix(4:28, ncol = 5), matrix(21:45, ncol=5))

list.sum<-do.call(sum,list)

list.sum<-do.call(cbind,list)  

do.call()是告訴list一個函式,然後list裡的所有元素來執行這個函式。

2、dplyr包

dplyr::bind_rows()

    mpg   cyl    hp  drat    wt  qsec    vs    am  gear  carb  disp
  (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
1  21.0     6   110  3.90 2.620 16.46     0     1     4     4    NA
2  21.0     6   110  3.90 2.875 17.02     0     1     4     4    NA
3  22.8     4    93  3.85 2.320 18.61     1     1     4     1    NA
4  21.4     6   110  3.08 3.215 19.44     1     0     3     1    NA
5  17.8     6   123  3.92 3.440 18.90     1     0     4     4 167.6
6  16.4     8   180  3.07 4.070 17.40     0     0     3     3 275.8
7  17.3     8   180  3.07 3.730 17.60     0     0     3     3 275.8
8  15.2     8   180  3.07 3.780 18.00     0     0     3     3 275.8

效果是,不匹配到的放在最後,且等於NA  NA  NA  NA

每每以為攀得眾山小,可、每每又切實來到起點,大牛們,緩緩腳步來俺筆記葩分享一下吧,please~

———————————————————————————