
R語(yǔ)言中數(shù)據(jù)清洗、整理的方法
數(shù)據(jù)的清理
如同列夫托爾斯泰所說(shuō)的那樣:“幸福的家庭都是相似的,不幸的家庭各有各的不幸”,糟糕的惡心的數(shù)據(jù)各有各的糟糕之處,好的數(shù)據(jù)集都是相似的。一份好的,干凈而整潔的數(shù)據(jù)至少包括以下幾個(gè)要素:
1、每一個(gè)觀測(cè)變量構(gòu)成一列
2、每一個(gè)觀測(cè)對(duì)象構(gòu)成一行
3、每一個(gè)類(lèi)型的觀測(cè)單元構(gòu)成一個(gè)表
就像我們最常接觸的鳶尾花數(shù)據(jù):
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
每一列就是觀測(cè)的指標(biāo):花瓣長(zhǎng)度,花瓣寬度,萼片長(zhǎng)度,萼片寬度,種類(lèi);每一行就是一株鳶尾花的觀測(cè)值,構(gòu)成整張表的元素就是四個(gè)數(shù)值變量,一個(gè)分類(lèi)分類(lèi)變量。
然而出于排版的考慮我們抓下來(lái)的數(shù)據(jù)往往不是那么的友好,比如說(shuō)我們可以看到的數(shù)據(jù)通常是這樣的:
## religion <10k 10k-50k 50k-100k
## 1 Agnostic 12 31 23
## 2 Buddhist 58 43 43
## 3 Catholic 79 56 23
而不是:
## religion income freq
## 1 Agnostic <10k 12
## 2 Agnostic 10k-50k 58
## 3 Agnostic 50k-100k 79
## 4 Buddhist <10k 31
當(dāng)然,除了這種把列表每一列代表一些數(shù)值這種情況外,還有多個(gè)變量?jī)?chǔ)存為一列(比如列表不僅以"<10k","10k-50k","50k-100k"做表頭,甚至還加上性別信息"m<10k","m10k-50k","m50k-100k","f<10k","f10k-50k","f50k-100k",其中m代表男性,f代表女性),還有更過(guò)分的將列表的變量不僅儲(chǔ)存在列中,行中也有統(tǒng)計(jì)變量。
面對(duì)這些不好的table,我們首先要做的就是數(shù)據(jù)管理,將數(shù)據(jù)整理為一個(gè)干凈的數(shù)據(jù)集。
數(shù)據(jù)管理
按照en:DAMA的定義:“數(shù)據(jù)資源管理,致力于發(fā)展處理企業(yè)數(shù)據(jù)生命周期的適當(dāng)?shù)慕?gòu)、策略、實(shí)踐和程序”。這是一個(gè)高層而包含廣泛的定義,而并不一定直接涉及數(shù)據(jù)管理的具體操作(如關(guān)系數(shù)據(jù)庫(kù)的技術(shù)層次上的管理)。我們這里主要講述對(duì)于數(shù)據(jù)的變量命名與數(shù)據(jù)的合并,旨在方便數(shù)據(jù)共享。
數(shù)據(jù)管理首先要做的就是大致上了解你的數(shù)據(jù),比如有什么樣的變量,每一行大致長(zhǎng)成什么樣,最常用的就是head(),tail().
我們要做的基本上就是這么幾項(xiàng)工作:
給每一個(gè)變量命名,而不是V1,V2,如果有必要可以給出code book。
每個(gè)變量名最好具有可讀性,除非過(guò)長(zhǎng),否則不要用縮寫(xiě),例如AgeAtDiagnosis這個(gè)命名遠(yuǎn)好于AgeDx。
通常來(lái)說(shuō),最好將數(shù)據(jù)放在一張表里面,如果因?yàn)閿?shù)據(jù)過(guò)多,項(xiàng)目過(guò)雜,分成了幾張表。那么一定需要有一列使得這些表之間能夠連接起來(lái),但盡量避免這樣做。
我們以UCI的Human Activity Recognition Using Smartphones Data Set 為例來(lái)看看數(shù)據(jù)是如何變成一個(gè)基本符合要求的數(shù)據(jù)。這個(gè)數(shù)據(jù)我們已經(jīng)下載下來(lái)了,其中關(guān)于數(shù)據(jù)的詳細(xì)信息可以參閱read me文檔,由于UCI的數(shù)據(jù)通常都是一個(gè)基本合乎規(guī)范的數(shù)據(jù)集(主要是指它的數(shù)據(jù)集的變量名都是以V1,V2來(lái)命名的)加上一個(gè)code
book。那么我們看看各個(gè)數(shù)據(jù)的名稱(chēng)(在feature文件里)
> setwd("C:/R/UCI HAR Dataset")> name<-read.table("./features.txt",stringsAsFactors = F)> head(name) V1 V21 1 tBodyAcc-mean()-X2 2 tBodyAcc-mean()-Y3 3 tBodyAcc-mean()-Z4 4 tBodyAcc-std()-X5 5 tBodyAcc-std()-Y6 6 tBodyAcc-std()-Z
我們可以看到各個(gè)特征的名稱(chēng)直接標(biāo)在數(shù)據(jù)上是非常不友善的,我們?yōu)榱俗屗哂锌勺x性,我們以展示在我們眼前的6個(gè)數(shù)據(jù)為例:
variablename <- head(name)# 將標(biāo)簽中的大寫(xiě)字母轉(zhuǎn)為小寫(xiě),我們這里沒(méi)有所以不再賦值,如果需要全變?yōu)榇髮?xiě),可以使用touppertolower(variablename$V2)
## [1] "tbodyacc-mean()-x" "tbodyacc-mean()-y" "tbodyacc-mean()-z"
## [4] "tbodyacc-std()-x" "tbodyacc-std()-y" "tbodyacc-std()-z"
# 將變量名分離成3部分splitNames <- strsplit(variablename$V2, "-")splitNames[[1]]
## [1] "tBodyAcc" "mean()" "X"
# 將變量名合成有意的名稱(chēng)named <- function(x) { rr <- paste(x[2], x[1], "-", x[3], sep = "")
chartr("()", "of", rr)
}
sapply(splitNames, named)
## [1] "meanoftBodyAcc-X" "meanoftBodyAcc-Y" "meanoftBodyAcc-Z"
## [4] "stdoftBodyAcc-X" "stdoftBodyAcc-Y" "stdoftBodyAcc-Z"
用這樣的名字給數(shù)據(jù)集命名就感覺(jué)舒服多了,我們將一些R中對(duì)字符串常用的操作函數(shù)總結(jié)如下,方便我們對(duì)數(shù)據(jù)名稱(chēng)的修改:
sub:替換字符串中的第一個(gè)模式為設(shè)定模式(pattern).
gsub:全局替換字符串中的相應(yīng)模式
grep,grepl:這兩個(gè)函數(shù)返回向量水平的匹配結(jié)果,grep僅返回匹配項(xiàng)的下標(biāo),而grepl返回所有的查詢(xún)結(jié)果,并用邏輯向量表示有沒(méi)有找到匹配。
nchar:統(tǒng)計(jì)字符串單字?jǐn)?shù)目
substr:取子串
paste:將字符串鏈接起來(lái),sep參數(shù)可以設(shè)置連接符
str_trim:去掉字符串空格
變量的名稱(chēng)建議滿(mǎn)足如下要求:
英文變量名盡可能用小寫(xiě)
盡可能的描述清楚變量特征 (Diagnosis versus Dx)
不要太復(fù)雜
不要有下劃線、點(diǎn)、空格
字符型變量應(yīng)該滿(mǎn)足:
是因子類(lèi)型的應(yīng)該轉(zhuǎn)化為factor
因子盡可能具有一定的描述性 (例如:如果0/1表示真假,那么用TRUE/FALSE代替0/1;在表示性別時(shí)用Male/Female代替M/F)
接下來(lái)我們討論數(shù)據(jù)集的合并,主要使用函數(shù)merge。
我們以下面兩個(gè)數(shù)據(jù)集的合并為例:
df1 <- data.frame(id = sample(1:10), reviewer_id = sample(5:14), time_left = sample(1321:1330),
x = rnorm(10))df2 <- data.frame(id = sample(1:10), answer = rep("B", 10), time_left = sample(321:330),
y = rnorm(10))
head(df1, n = 3)
## id reviewer_id time_left x
## 1 3 9 1326 -0.9232
## 2 10 5 1322 2.5069
## 3 1 14 1330 2.2478
head(df2, n = 3)
## id answer time_left y
## 1 1 B 329 0.8180
## 2 10 B 327 1.4639
## 3 9 B 323 0.8141
merge函數(shù)調(diào)用格式為:
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"),
incomparables = NULL, ...)
參數(shù)說(shuō)明:
x,y:兩個(gè)數(shù)據(jù)框
by, by.x, by.y:指定用于合并的列的名稱(chēng)。
all,all.x,all.y:默認(rèn)的all = FALSE相當(dāng)于自然連接, 或者說(shuō)是內(nèi)部鏈接. all.x = TRUE是一個(gè)左連接, all.y = TRUE是一個(gè)又連接, all = TRUE 相當(dāng)于一個(gè)外部鏈接.
仔細(xì)觀察下面3個(gè)例子你就會(huì)發(fā)現(xiàn)其中的奧秘:
mergedData <- merge(df1,df2,by.x="reviewer_id",by.y="id",all=TRUE)
head(mergedData)
## reviewer_id id time_left.x x answer time_left.y y
## 1 1 NA NA NA B 329 0.8180
## 2 2 NA NA NA B 330 -0.7706
## 3 3 NA NA NA B 325 -0.4851
mergedData <- merge(df1,df2,by.x="id",by.y="id",all=TRUE)
head(mergedData)
## id reviewer_id time_left.x x answer time_left.y y
## 1 1 14 1330 2.24783 B 329 0.8180
## 2 2 12 1324 1.03181 B 330 -0.7706
## 3 3 9 1326 -0.92317 B 325 -0.4851
## 4 4 7 1321 -0.07841 B 322 0.1801
mergedData2 <- merge(df1,df2,all=TRUE)
head(mergedData2)
## id time_left reviewer_id x answer y
## 1 1 329 NA NA B 0.8180
## 2 1 1330 14 2.2478 <NA> NA
## 3 2 330 NA NA B -0.7706
在plyr包中還提供了join,join_all,arrange等函數(shù)來(lái)實(shí)現(xiàn)表的連接,但我想merge這個(gè)函數(shù)已經(jīng)足夠用了,所以我們不在多說(shuō)。當(dāng)然,在極少數(shù)特別好的情況下(比如列的變量是一致的,或者行的觀測(cè)個(gè)體是一致的時(shí)候)rbind,cbind也是有用的。
有些時(shí)候我們會(huì)遇到一些特殊的字符串:日期。R中提供了各式各樣的函數(shù)來(lái)處理時(shí)間:
Sys.setlocale("LC_TIME", "C")
## [1] "C"
x <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")z <- as.Date(x, "%d%b%Y")
format(z, "%a %b %d")
## [1] "Fri Jan 01" "Sat Jan 02" "Thu Mar 31" "Sat Jul 30"
weekdays(z)
## [1] "Friday" "Saturday" "Thursday" "Saturday"
julian(z)
## [1] -3653 -3652 -3563 -3442
## attr(,"origin")
## [1] "1970-01-01"
transform(z, weekend = as.POSIXlt(z, format = "%Y/%m/%d")$wday %in% c(0, 6))
## X_data weekend
## 1 1960-01-01 FALSE
## 2 1960-01-02 TRUE
## 3 1960-03-31 FALSE
## 4 1960-07-30 TRUE
數(shù)據(jù)操作與整合
說(shuō)到數(shù)據(jù)操作,這也是一個(gè)十分寬泛的話題,在這里我們就以下4個(gè)方面進(jìn)行介紹:
數(shù)據(jù)的篩選,過(guò)濾:根據(jù)一些特定條件選出或者刪除一些觀測(cè)
數(shù)據(jù)的變換:增加或者修改變量
數(shù)據(jù)的匯總:分組計(jì)算數(shù)據(jù)的和或者均值
數(shù)據(jù)的排序:改變觀測(cè)的排列順序
然而在進(jìn)行這一切之前首先要做的就是了解你的數(shù)據(jù),我們以世界銀行的數(shù)據(jù)Millennium Development Goals為例,來(lái)一步步演示如何進(jìn)行數(shù)據(jù)操作:
if (!file.exists("C:/Users/yujun/Documents/MDG_Data.csv")) {
download.file("http://databank.worldbank.org/data/download/MDG_csv.zip","F:/MDG.zip")
unzip("F:/MDG.zip")
}MDstats<-read.csv("C:/Users/yujun/Documents/MDG_Data.csv")
首先先來(lái)看一部分?jǐn)?shù)據(jù):
head(MDstats)
## Country.Name Country.Code
## 1 Afghanistan AFG
## 2 Afghanistan AFG
## 3 Afghanistan AFG
tail(MDstats)
## Country.Name Country.Code
## 33093 Zimbabwe ZWE
## 33094 Zimbabwe ZWE
## 33095 Zimbabwe ZWE
## 33096 Zimbabwe ZWE
我們顯然發(fā)現(xiàn)了這不是一個(gè)tidy data,那么我們先將其變換為我們喜歡的tidy data,之后再看看數(shù)據(jù)摘要及數(shù)據(jù)集各單元的屬性:
## countryname countrycode
## 1 Afghanistan AFG
## 2 Afghanistan AFG
## 3 Afghanistan AFG
## 4 Afghanistan AFG
## 5 Afghanistan AFG
## 6 Afghanistan AFG
## indicatorname
## 1 Adolescent fertility rate (births per 1,000 women ages 15-19)
## 2 Agricultural support estimate (% of GDP)
我們可以看看各個(gè)數(shù)值數(shù)據(jù)的分位數(shù):
quantile(MDstatsMelt$value,na.rm=TRUE)
## 0% 25% 50% 75% 100%
## -9.431e+08 1.054e+01 5.060e+01 9.843e+01 7.526e+13
看看各個(gè)國(guó)家的統(tǒng)計(jì)數(shù)據(jù)有多少:
table(MDstatsMelt$countrycode)
##
## ABW ADO AFG AGO ALB ARB ARE ARG ARM ASM ATG AUS AUT AZE BDI
## 3216 3216 3216 3216 3216 3216 3216 3216 3216 3216 3216 3216 3216 3216 3216
## BEL BEN BFA BGD BGR BHR BHS BIH BLR BLZ BMU BOL BRA BRB BRN
看看缺失值:
sum(is.na(MDstatsMelt$value)) #總的缺失值
## [1] 495519
colSums(is.na(MDstatsMelt)) #每一列的缺失值
## countryname countrycode indicatorname indicatorcode year
## 0 0 0 0 0
## value
## 495519
# 如果我們用回tidy前的數(shù)據(jù)集,那么這個(gè)函數(shù)會(huì)顯得比較有用colSums(is.na(MDstats))
## Country.Name Country.Code Indicator.Name Indicator.Code X1990
## 0 0 0 0 23059
## X1991 X1992 X1993 X1994 X1995
## 22293 21672 21753 21491 20970
## X1996 X1997 X1998 X1999 X2000
## 20680 20448 20419 19933 18822
# 等價(jià)的處理方式stat <- function(x) {
sum(is.na(x))
}
tapply(MDstatsMelt$value, MDstatsMelt$year, stat)
## X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998 X1999 X2000 X2001
## 23059 22293 21672 21753 21491 20970 20680 20448 20419 19933 18822 19598
## X2002 X2003 X2004 X2005 X2006 X2007 X2008 X2009 X2010 X2011 X2012 X2013
## 19119 19478 19269 18704 19044 18641 19256 19162 18756 20360 21967 30625
統(tǒng)計(jì)某個(gè)國(guó)家的統(tǒng)計(jì)數(shù)據(jù)占總統(tǒng)計(jì)數(shù)目的多少
table(MDstatsMelt$countryname %in% c("China"))
##
## FALSE TRUE
## 791136 3216
prop <- table(MDstatsMelt$countryname %in% c("China"))[2]/sum(table(MDstatsMelt$countryname %in% c("China")))prop
## TRUE
## 0.004049
看看數(shù)據(jù)集的大小:
object.size(MDstatsMelt)
## 22301832 bytes
print(object.size(MDstatsMelt),units="Mb")
## 21.3 Mb
至此,我們可以說(shuō)我們對(duì)數(shù)據(jù)有了一定的了解。另外值得一提的是,對(duì)于某些特定的數(shù)據(jù),也許xtabs,ftable是有用的。
數(shù)據(jù)的篩選
要提取相應(yīng)內(nèi)容的數(shù)據(jù),最為常用的就是提取相應(yīng)元素,比如提取某個(gè)元素,提取某一行,某一列。我們通過(guò)下面下面的例子來(lái)學(xué)習(xí):
data<-data.frame(a=sample(1:10),b=rep(c("a","b"),each=5),cdf=rnorm(10))data
## a b cdf
## 1 1 a 0.5755
## 2 10 a 0.8087
## 3 2 a 0.9810
## 4 7 a -0.4635
## 5 4 a 0.5094
#提取相應(yīng)元素data[2,1]
## [1] 10
data[[1]][[2]]
## [1] 10
data[[c(1,2)]]
## [1] 10
data$a[2]
## [1] 10
#提取某一列data[[3]]
## [1] 0.5755 0.8087 0.9810 -0.4635 0.5094 1.0514 -1.5338 1.0047
## [9] 1.0004 -1.3566
data$cdf
## [1] 0.5755 0.8087 0.9810 -0.4635 0.5094 1.0514 -1.5338 1.0047
## [9] 1.0004 -1.3566
data$c
## [1] 0.5755 0.8087 0.9810 -0.4635 0.5094 1.0514 -1.5338 1.0047
## [9] 1.0004 -1.3566
data[["c"]]
## NULL
data[["c", exact = FALSE]]
## [1] 0.5755 0.8087 0.9810 -0.4635 0.5094 1.0514 -1.5338 1.0047
## [9] 1.0004 -1.3566
數(shù)據(jù)的篩選還有一個(gè)最為常用的的就是移除缺失值:
data<-data.frame(a=c(sample(1:5),NA,NA,sample(6:10)),b=c(rep(c("a","b"),each=5),NA,NA),cdf=rnorm(12))data
## a b cdf
## 1 5 a -0.276400
## 2 1 a -1.861240
good <- complete.cases(data)data[good, ]
## a b cdf
## 1 5 a -0.2764
## 2 1 a -1.8612
## 3 3 a -2.0280
bad <- as.data.frame(is.na(data))data[!(bad$a|bad$b|bad$c),]
## a b cdf
## 1 5 a -0.2764
## 2 1 a -1.8612
數(shù)據(jù)篩選有時(shí)是為了獲得符合條件的數(shù)據(jù):
X <- data.frame("var1"=sample(1:5),"var2"=sample(6:10),"var3"=sample(11:15))X <- X[sample(1:5),]; X$var2[c(1,3)] = NAX
## var1 var2 var3
## 2 5 NA 13
## 5 3 6 15
## 1 2 NA 12
## 3 1 8 11
## 4 4 9 14
X[(X$var1 <= 3 & X$var3 > 11),]
## var1 var2 var3
## 5 3 6 15
## 1 2 NA 12
subset(X,(X$var1 <= 3 & X$var3 > 11))
## var1 var2 var3
## 5 3 6 15
## 1 2 NA 12
X[(X$var1 <= 3 | X$var3 > 15),]
## var1 var2 var3
## 5 3 6 15
## 1 2 NA 12
## 3 1 8 11
X[which(X$var1 <= 3 | X$var3 > 15),]
## var1 var2 var3
## 5 3 6 15
## 1 2 NA 12
## 3 1 8 11
對(duì)于取子集的函數(shù)subset,在幫助文檔中有一段warning是值得我們注意的:“This is a convenience function intended for use interactively. For programming it is better to use the standard subsetting functions like [, and in particular the non-standard evaluation of argument subset can have unanticipated
consequences."
數(shù)據(jù)的變換
常見(jiàn)的數(shù)據(jù)變換函數(shù)有:
abs(x) 絕對(duì)值
sqrt(x) 開(kāi)根號(hào)
ceiling(x) 求上線,例:ceiling(3.475) = 4
floor(x) 求下線,例:floor(3.475) = 3
round(x,digits=n) 四舍五入,例:round(3.475,digits=2) = 3.48
signif(x,digits=n) 四舍五入,例:signif(3.475,digits=2) = 3.5
cos(x), sin(x) etc.三角變換
log(x) 對(duì)數(shù)變換
log2(x), log10(x) 以2、10為底的對(duì)數(shù)變換
exp(x) 指數(shù)變換
除此以外,我們還經(jīng)常對(duì)數(shù)據(jù)加標(biāo)簽,以期在回歸中測(cè)量其效應(yīng)。我們以MASS包的shuttle數(shù)據(jù)集為例,想知道不同類(lèi)型的風(fēng)(wind)是否需要使用不同的裝載機(jī)(use),這里我們希望將head wind標(biāo)記為1,auto use也記為1,我們可以按照如下辦法設(shè)置虛擬變量:
library(MASS)
data(shuttle)
head(shuttle)
## stability error sign wind magn vis use
## 1 xstab LX pp head Light no auto
## 2 xstab LX pp head Medium no auto
## 3 xstab LX pp head Strong no auto
## 4 xstab LX pp tail Light no auto
## 5 xstab LX pp tail Medium no auto
## 6 xstab LX pp tail Strong no auto
## Make our own variables just for illustrationshuttle$auto <- 1 * (shuttle$use == "auto")shuttle$headwind <- 1 * (shuttle$wind == "head")
head(shuttle)
## stability error sign wind magn vis use auto headwind
## 1 xstab LX pp head Light no auto 1 1
## 2 xstab LX pp head Medium no auto 1 1
當(dāng)然對(duì)于因子類(lèi)型變量,relevel函數(shù)在線性模型的分析中也是能取得等價(jià)效果的。
有些時(shí)候,我們還常常將連續(xù)數(shù)據(jù)離散化,這時(shí)我們需要用到函數(shù)cut:
data <- rnorm(1000)
table(cut(data, breaks = quantile(data)))
##
## (-3.28,-0.637] (-0.637,0.0321] (0.0321,0.672] (0.672,3.37]
## 249 250 250 250
library(Hmisc)
table(cut2(data, g = 4))
##
## [-3.2847,-0.6372) [-0.6372, 0.0334) [ 0.0334, 0.6829) [ 0.6829, 3.3704]
## 250 250 250 250
detach("package:Hmisc", unload = TRUE)
獲得分組區(qū)間后,我們只需要將區(qū)間的因子重命名就成功的實(shí)現(xiàn)了數(shù)據(jù)的離散化。
數(shù)據(jù)的匯總
對(duì)數(shù)據(jù)進(jìn)行匯總,分類(lèi)匯總是我們也比較常用的,比如對(duì)行或列求和,求均值,求分位數(shù):
data <- matrix(1:16, 4, 4)data
## [,1] [,2] [,3] [,4]
## [1,] 1 5 9 13
## [2,] 2 6 10 14
## [3,] 3 7 11 15
## [4,] 4 8 12 16
apply(data, 2, mean)
## [1] 2.5 6.5 10.5 14.5
apply(data, 1, sum)
## [1] 28 32 36 40
apply(data, 1, quantile, probs = c(0.25, 0.75))
## [,1] [,2] [,3] [,4]
## 25% 4 5 6 7
## 75% 10 11 12 13
apply(data, 2, quantile, probs = c(0.25, 0.75))
## [,1] [,2] [,3] [,4]
## 25% 1.75 5.75 9.75 13.75
## 75% 3.25 7.25 11.25 15.25
有時(shí)候,為了更快些,我們會(huì)用一些函數(shù)替代apply:
rowSums = apply(x, 1, sum)
rowMeans = apply(x, 1, mean)
colSums = apply(x, 2, sum)
colMeans = apply(x, 2, mean
我們有時(shí)也會(huì)處理一些列表,對(duì)列表的分類(lèi)匯總我們會(huì)用到sapply,lapply,不同的是前者返回一個(gè)向量或矩陣,后者返回一個(gè)列表,例:
x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
lapply(x, mean)
## $a
## [1] 5.5
##
## $beta
## [1] 4.535
##
## $logic
## [1] 0.5
sapply(x, mean)
## a beta logic
## 5.500 4.535 0.500
# median and quartiles for each list elementlapply(x, quantile, probs = 1:3/4)
## $a
## 25% 50% 75%
## 3.25 5.50 7.75
##
## $beta
## 25% 50% 75%
## 0.2516 1.0000 5.0537
##
## $logic
## 25% 50% 75%
## 0.0 0.5 1.0
sapply(x, quantile)
## a beta logic
## 0% 1.00 0.04979 0.0
## 25% 3.25 0.25161 0.0
## 50% 5.50 1.00000 0.5
## 75% 7.75 5.05367 1.0
## 100% 10.00 20.08554 1.0
有時(shí)候我們還會(huì)進(jìn)行分類(lèi)匯總,如統(tǒng)計(jì)男女工資均值,這時(shí)你可以用tapply:
group <- (rbinom(32, n = 20, prob = 0.4))groups <- factor(rep(1:2,10))
tapply(group, groups, length)
## 1 2
## 10 10
tapply(group, groups, sum)
## 1 2
## 135 122
tapply(group, groups, mean)
## 1 2
## 13.5 12.2
數(shù)據(jù)的排序
數(shù)據(jù)的排序需要用到的函數(shù)常見(jiàn)的有sort和order,其中sort返回排序的結(jié)果,order返回對(duì)應(yīng)數(shù)據(jù)的排名。例:
X <- data.frame("var1"=sample(1:5),"var2"=sample(6:10),"var3"=sample(11:15))X <- X[sample(1:5),]X$var2[c(1,3)] <- NAsort(X$var2,decreasing=TRUE)
## [1] 9 8 6
sort(X$var2,decreasing=TRUE,na.last=TRUE)
## [1] 9 8 6 NA NA
order(X$var2,decreasing=TRUE)
## [1] 2 5 4 1 3
order(X$var2,decreasing=TRUE,na.last=TRUE)
## [1] 2 5 4 1 3
X[order(X$var2),]
## var1 var2 var3
## 2 1 6 13
## 5 5 8 15
## 4 4 9 11
## 1 2 NA 14
## 3 3 NA 12
#deal with the linkX$var2[c(1)] <- sample(na.omit(X$var2),1)X[order(X$var2,X$var3),]
## var1 var2 var3
## 2 1 6 13
## 5 5 8 15
## 4 4 9 11
## 1 2 9 14
## 3 3 NA 12
有些時(shí)候,更為強(qiáng)大的aggregate函數(shù)是我們需要的,我們以R的內(nèi)置數(shù)據(jù)集state.x77為例:
aggregate(state.x77, list(Region = state.region, Cold = state.x77[,"Frost"] > 130), mean)
## Region Cold Population Income Illiteracy Life Exp Murder HS Grad
## 1 Northeast FALSE 8802.8 4780 1.1800 71.13 5.580 52.06
## 2 South FALSE 4208.1 4012 1.7375 69.71 10.581 44.34
## 3 North Central FALSE 7233.8 4633 0.7833 70.96 8.283 53.37
## 4 West FALSE 4582.6 4550 1.2571 71.70 6.829 60.11
## 5 Northeast TRUE 1360.5 4308 0.7750 71.44 3.650 56.35
## 6 North Central TRUE 2372.2 4589 0.6167 72.58 2.267 55.67
當(dāng)然,這里還有一個(gè)更為基本與靈活的函數(shù),split,可以幫助你將數(shù)據(jù)分為若干張滿(mǎn)足分類(lèi)條件的表,你可以一張一張的處理它們:
library(datasets)
head(airquality)
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶(hù) ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱(chēng) BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢(xún)到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢(xún)結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢(xún)結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專(zhuān)注于從單 ...
2025-07-09year_month數(shù)據(jù)類(lèi)型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類(lèi)型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門(mén)控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書(shū)考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專(zhuān)業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03