dataframe是R的特色數(shù)據(jù)結(jié)構(gòu)之一。它相當(dāng)于matrix + list,因此二者的很多性質(zhì)也直接繼承了過來。
創(chuàng)建
dataframe創(chuàng)建的基本格式依然是 data.frame(col_names = col_values) , 這一點類似于list。如果不特異指定rownames的話,第一個含有names的column將成為這個df的命名者。但我們也可以用row.names(df) <- NULL 或 某vector來指定名稱或?qū)⒚Q清零。
由于繼承了matrix的性質(zhì),因此colnames() rownames() dimnames() ncol() nrow()這些函數(shù)也都適用于dataframe。而由于繼承了list的性質(zhì),length()和names()對于dataframe來說相當(dāng)于ncol()和colnames() .
在構(gòu)建dataframe時,不同的column可以長度不同,但要求很苛刻,實際使用時應(yīng)盡量避免。
索引
dataframe可以同時使用matrix和list風(fēng)格的索引。但索引的輸出結(jié)果要注意一下type:
> class(iris[1]) #輸出的依然是個dataframe
[1] "data.frame" #這里是list的語法
> class(iris[,1])
[1] "numeric"
> class(iris[[1]])
[1] "numeric"
> class(iris$Sepal.Length)
[1] "numeric"
subset()也能在dataframe中進(jìn)行篩選,輸出一個新的dataframe。它的基本格式是:
subset(
dataframe_name,
subset,#邏輯vector,用于篩選rows
select # 表達(dá)式,用于篩選columns
)
> subset(airquality, Day==1,select = Ozone:Wind)
#也可以直接寫airquality, Day==1,Ozone:Wind
Ozone Solar.R Wind
1 41 190 7.4
32 NA 286 8.6
62 135 269 4.1
93 39 83 6.9
124 96 167 6.9
操作
dataframe可以使用t()轉(zhuǎn)置。
rbind和cbind()也適用于dataframe。但rbind必須二者的names能夠一一對應(yīng),否則報錯。cbind則直接結(jié)合,但也要注意nrow是否一致。
> x=data.frame(x=1:3,y=2:4,z=3:5)
> y=data.frame(y=0:2,z=4:6,t=5:7)
> rbind(x,y)
Error in match.names(clabs, names(xi)) : 名字同原來已有的名字不相對
> p=data.frame(a=1:4,b=2:5,c=3:6)
> cbind(x,p)
Error in data.frame(..., check.names = FALSE) :
參數(shù)值意味著不同的行數(shù): 3, 4
R自帶的merge()能夠合并兩個dataframe。具體的語法可參考文檔。它的基本格式是:
> merge(df_x, df_y,
by.x = col_name_x , by.y = col_name_y ,
all = TRUE
)