數(shù)據(jù)框是列表的一種特例,可以看成是每個組件都是長度相同的向量的列表。數(shù)據(jù)框有類似列表的特性,也有類似矩陣的特性。
創(chuàng)建數(shù)據(jù)框
data.frame() 函數(shù):
> kids
[1] "Jack" "Jill"
> ages
[1] 12 10
> # stringsAsFactors=FALSE 參數(shù)相當于 as.is=TRUE
> # options() 函數(shù)可以設(shè)置全局 stringsAsFactors 選項
> d <- data.frame(kids,ages,stringsAsFactors=FALSE)
> d
kids ages
1 Jack 12
2 Jill 10
> str(d)
'data.frame': 2 obs. of 2 variables:
$ kids: chr "Jack" "Jill"
$ ages: num 12 10
> # 不同的訪問數(shù)據(jù)框的列的方式,有列表的方式和矩陣的方式
> d[[1]]
[1] "Jack" "Jill"
> d$kids
[1] "Jack" "Jill"
> d[,1]
[1] "Jack" "Jill"
提取子集
數(shù)據(jù)框提取子集的方法可以用類似矩陣取子集的方式,也可以用矩陣的方式進行篩選。
缺失值(NA)的去除可以用 na.rm=TREU 。
subset() 函數(shù)取子集,默認去除缺失值 NA,更方便。
從數(shù)據(jù)框中去除包含缺失值的觀測,可以利用 complete.case() 函數(shù)簡化操作,complet.case() 函數(shù)檢測每一行是否包含 NA 生成一個布爾型向量。
rbind() 和 cbind() 函數(shù)也可以用來給數(shù)據(jù)框增加行和列。
合并數(shù)據(jù)框
merge() 函數(shù),類似關(guān)系型數(shù)據(jù)庫中根據(jù)某個共同變量合并兩個表,merge() 函數(shù)可以合并兩個數(shù)據(jù)框并生成一個新的數(shù)據(jù)框:
> d1
kids states
1 Jack CA
2 Jill MA
3 Jillian MA
4 John HI
> d2
ages kids
1 10 Jill
2 7 Lillian
3 12 Jack
> d <- merge(d1,d2)
> d
kids states ages
1 Jack CA 12
2 Jill MA 10
> # 共同變量有重復(fù)值,用 merge() 合并出現(xiàn)錯誤
> d2a <- rbind(d2,list(15,"Jill"))
> d2a
ages kids
1 10 Jill
2 7 Lillian
3 12 Jack
4 15 Jill
> merge(d1,d2a)
kids states ages
1 Jack CA 12
2 Jill MA 10
3 Jill MA 15
如果共同變量在其中一個數(shù)據(jù)框中有重復(fù)值,用 merge() 合并可能出現(xiàn)錯誤。
對數(shù)據(jù)框使用 lapply() 函數(shù)
數(shù)據(jù)框是列表的一種特例,也可以應(yīng)用 lapply() 函數(shù)。
> d2
ages kids
1 10 Jill
2 7 Lillian
3 12 Jack
> d3 <- lapply(d2,sort)
> d3
$ages
[1] 7 10 12
$kids
[1] "Jack" "Jill" "Lillian"
但這個例子破壞了名字和年齡之間的對應(yīng)關(guān)系,沒有意義,僅為示例。
讀古人的書,一方面要知道古人聰明到怎樣,一方面也要知道古人傻到怎樣。--胡適