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用法
其中,all=T代表全連線,all.x=T代表左聯結;all.y=T代表右連線> 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
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~
———————————————————————————