4.1 創(chuàng)建新變量
在你需要的分析數(shù)據(jù)中,往往要用新的變量或者對現(xiàn)有的變量進行變換:變量名 <- 表達式
。
而在表達式中,往往包含很多種的運算符和函數(shù):
數(shù)據(jù)框中創(chuàng)建添加心變量的三種方式,其實第一種和第二種是完全一樣的,第三種使用
transform()
函數(shù)來創(chuàng)建新的變量。
mydata<-data.frame(x1 = c(2, 2, 6, 4),
x2 = c(3, 4, 2, 8))
mydata$sumx <- mydata$x1 + mydata$x2
mydata$meanx <- (mydata$x1 + mydata$x2)/2
attach(mydata)
mydata$sumx <- x1 + x2
mydata$meanx <- (x1 + x2)/2
detach(mydata)
mydata <- transform(mydata,
sumx = x1 + x2,
meanx = (x1 + x2)/2)
4.2 變量的重編碼
重編碼數(shù)據(jù),可以使用R中一個或多個邏輯值運算符。能夠返回邏輯值
需要將其中的年齡變量重新編碼,99歲的年齡值重編碼為缺失值:
leadership$age[leadership$age == 99] <- NA
接著使用以下代碼創(chuàng)建重編碼之后的新變量:
# within()和with()函數(shù)類似,不同在于within()函數(shù)可以修改數(shù)據(jù)框。
變量[原始變量邏輯運算] <- 表達式
leadership <- within(leadership,{
agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <= 75] <- "Middle Aged"
agecat[age < 55] <- "Young" })
4.3 變量的重命名
- 如果對現(xiàn)有的變量名不滿意,那么就可以交互或者編程的方式進行修。
fix(數(shù)據(jù)框)
來調(diào)用一個交互式的編輯器,圖形化界面,修改就可以。 -
names()
函數(shù)來重命名變量。如names(leadership)[2] <- "testDate"
可以將date重新命名為testDate。 - 此外還有plyr包中的一個
rename()
函數(shù),可用于修改變量名。
4.4 缺失值(NA)
- R提供了一些函數(shù),用于識別包含缺失值的觀測。比如
is.na()
函數(shù)可以檢測是否存在缺失值,如果存在,則將被在相應(yīng)位置返回TRUE值。 - 在數(shù)據(jù)分析之前,以某種方式刪除缺失值。含有缺失值的算術(shù)表達式和函數(shù)的計算結(jié)果都是缺失值。大多數(shù)函數(shù)擁有一個
na.rm=TRUE
選項,可以在計算之前移除缺失值并使用剩余的值計算 - 還可以通過
na.omit()
函數(shù)刪除所有含有缺失數(shù)據(jù)的行。行刪除,是處理不完整數(shù)據(jù)集的若干手段之一。
4.5 日期值
日期值通常以字符串的形式輸入到R中,然后轉(zhuǎn)化為以數(shù)值形式存儲的日期變量。函數(shù)as.Data()
用于執(zhí)行這種轉(zhuǎn)化。語法:as.Data(x, "input_format")
,其中x是字符型數(shù)據(jù),input_format則給出了用于讀入日期的適當格式。
使用指定格式讀取字符型變量,并將其作為一個日期變量替換到數(shù)據(jù)框中。這種轉(zhuǎn)換一旦完成,就可以使用諸多方法對這些日期進行分析和繪圖。
Sys.Date()
和date()
分別是可以返回當天的日期和當前日期和時間的函數(shù)。
函數(shù)format(x, format="output_format")
可以輸出指定格式的日期值,并且可以提取日期中的某些部分。
today <- Sys.Date()
format(today, format="%B %d %Y")
format(today, format="%A")
R的內(nèi)部在存儲日期時,是使用自1970年1月1日以來的天數(shù)表示的,更早的日期為負數(shù)。所以可以在日期值上執(zhí)行算術(shù)運算。
startdate <- as.Date("2004-02-13")
enddate <- as.Date("2009-06-22")
days <- enddate - startdate
用difftime()
來計算時間間隔,并以星期、天、時、分、秒來表示
today <- Sys.Date()
dob <- as.Date("1956-10-12")
# units參數(shù)來指定表示方式,這里是weeks
difftime(today, dob, units="weeks")
當然,也可以將日期轉(zhuǎn)換為字符型變量。函數(shù)as.character()
可將日期值轉(zhuǎn)換為字符型。一旦轉(zhuǎn)換完成,可以用一系列字符處理函數(shù)處理數(shù)據(jù)。此外,lubridate包和timeDate包也提供了大量的日期處理函數(shù),可以對日期進行運算。
4.6 類型轉(zhuǎn)換
R中提供了一系列判斷某個對象的數(shù)據(jù)類型和將其轉(zhuǎn)換為另一種數(shù)據(jù)類型的函數(shù)。is.datatype()
這些函數(shù)結(jié)合控制流使用時,將成為一類強大的工具,即允許根據(jù)數(shù)據(jù)的具體類型以不同的方式處理數(shù)據(jù)。
4.7 數(shù)據(jù)排序
order()
函數(shù)可以對一個數(shù)據(jù)框進行排序,默認的排序順序是升序。在排序變量的前邊加一個減號,即可以得到降序的結(jié)果。一般是由女性到男性。
4.8 數(shù)據(jù)集的合并
- 要橫向合并兩個數(shù)據(jù)框,要使用
merge()
函數(shù)。大多數(shù)情況下,兩個數(shù)據(jù)框是通過一個或者多個變量聯(lián)結(jié)的。total <- merge(dataframeA, dataframeB, by = "ID")
就是通過ID將兩個數(shù)據(jù)框合并。類似的橫向聯(lián)結(jié)通常用于向數(shù)據(jù)框中添加變量,此外cbind()
進行直接橫向合并,每個對象要有相同的行數(shù)以同樣順序排列。 -
rbind()
可以縱向合并兩個數(shù)據(jù)框,但兩個數(shù)據(jù)框必須擁有相同的變量,順序不必相同。
4.9 數(shù)據(jù)集取子集
- 保留變量:我們經(jīng)常會從大數(shù)據(jù)集中選取小數(shù)據(jù)集,可以通過下標的方式來選擇變量。下標留空,表示選擇所有的行或者列。
- 剔除變量:
# 首先生成所有變量名的字符型向量,返回一個邏輯向量,匹配q3和q4的為TRUE值,最后用!將邏輯值反轉(zhuǎn),最后選擇邏輯值為TRUE的列,q3和q4被剔除。
myvars <- names(leadership) %in% c("q3", "q4")
leadership[!myvars]
# 其他的方法也可以剔除,在某一列的下標之前加一個減號。會剔除那一列
newdata <- leadership[c(-8,-9)]
# 將q3和q4設(shè)定為未定義,也可以完成變量刪除工作
leadership$q3 <- leadership$q4 <- NULL
-
subset()
函數(shù)是選擇變量和觀測最簡單的方法:
# 選擇了q1到q4中,年齡大于等于或者小于24的觀測值
newdata <- subset(leadership, age >= 35 | age < 24,
select=c(q1, q2, q3, q4))
# 選擇了gender到q4變量中,年齡大于25的男性的觀測值
newdata <- subset(leadership, gender=="M" & age > 25,
select=gender:q4)
第四章終于完成學習,算是對我之前學習的一個復(fù)習,接下來第五章就是全新的開始了,或許會更艱難,快要涉及到統(tǒng)計學。