《R语言实战》第4章
生活随笔
收集整理的這篇文章主要介紹了
《R语言实战》第4章
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
# 第四章 基本數(shù)據(jù)管理
# 4.1 一個(gè)例子
manager <- c(1, 2, 3, 4, 5)
date <- c("10/24/08", "10/28/08", "10/1/08", "10/12/08", "5/1/09")
country <- c("US", "US", "UK", "UK", "UK")
gender <- c("M", "F", "F", "M", "F")
age <- c(32, 45, 25, 39, 99)
q1 <- c(5, 3, 3, 3, 2)
q2 <- c(4, 5, 5, 3, 2)
q3 <- c(5, 2, 5, 4, 1)
q4 <- c(5, 3, 3, 3, 2)
q5 <- c(5, 3, 3, 3, 2)
leadership <- data.frame(manager, date, country, gender, age,q1, q2, q3, q4, q5, stringsAsFactors = FALSE)# 4.2 創(chuàng)建新變量
# 定義數(shù)據(jù)框
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.3 變量的重編碼
# 重編碼涉及根據(jù)同一個(gè)變量和/或其他變量的現(xiàn)有值創(chuàng)建新值的過(guò)程
# 語(yǔ)句variable[condition] <- expression將僅在condition的值為TRUE時(shí)執(zhí)行賦值。
# 必須將99歲的年齡值重編碼為缺失值
leadership$age[leadership$age == 99] <- NA
leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age >= 55 &leadership$age <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 75] <- "Yong"
# 可以將上面的代碼寫成更緊湊的
leadership <- within(leadership, {agecat <- NAagecat[age > 75] <- "Elder"agecat[age >= 55 & age <= 75] <- "Middle Age"agecat[age < 55] <- "Yong"})# 4.4 變量的重命名
# 如果對(duì)現(xiàn)有的變量名稱不滿意,你可以交互地或者以編程的方式修改它們
install.packages("reshape")
library(reshape)
# 格式:rename(dataframe, c(oldname = "newname”, oldname = "newname"),...)
# 例子:
leadership <- rename(leadership,c(manager = "managerID", date = "testDate"))
# 可以通過(guò)names()函數(shù)來(lái)重命名變量
names(leadership)[2] <- "testDate"
# 類似的方式:
names(leadership)[6:10] <- c("item1", "item2", "item3", "item4", "item5")
# 還原
names(leadership)[6:10] <- c("q1", "q2", "q3", "q4", "q5")# 4.5 缺失值
# 缺失值以符號(hào)NA(Not Available,不可用)表示
# 不可能出現(xiàn)的值(例如,被0除的結(jié)果) 通過(guò)符號(hào)NaN(Not a Number,非數(shù)值)來(lái)表示
y <- c(1, 2, 3, NA)
is.na(y)
# leadership
is.na(leadership[, 6:10])# 4.5.2 在分析中排除缺失值
# 由于x中的第3個(gè)元素是缺失值,所以y和z也都是NA(缺失值)。
x <- c(1, 2, NA, 3)
y <- x[1] + x[2] + x[3] + x[4]
z <- sum[x]
# 好在多數(shù)的數(shù)值函數(shù)都擁有一個(gè)na.rm=TRUE選項(xiàng),可以在計(jì)算之前移除缺失值并使用剩余值進(jìn)行計(jì)算:
y <- sum(x, na.rm = TRUE)
# 可以通過(guò)函數(shù)na.omit()移除所有含有缺失值的觀測(cè)。na.omit()可以刪除所有含有缺 失數(shù)據(jù)的行。
newdata <- na.omit(leadership)# 4.6 日期值
# 日期值通常以字符串的形式輸入到R中,然后轉(zhuǎn)化為以數(shù)值形式存儲(chǔ)的日期變量。函數(shù)as.Date()用于執(zhí)行這種轉(zhuǎn)化。其語(yǔ)法為as.Date(x, "input_format"),其中x是字符型數(shù) 據(jù),input_format則給出了用于讀入日期的適當(dāng)格式
# 日期格式
# 符號(hào) 含義 示例
# %d 數(shù)字表示的日期(0~31) 01~31
# %a 縮寫的星期名 Mon
# %A 非縮寫星期名 Monday
# %m 月份(00~12) 00~12
# %b 縮寫的月份 Jan
# %B 非縮寫的月份 January
# %y 兩位數(shù)的年份 07
# $Y 四位數(shù)的年份 2007
# 日期值的默認(rèn)輸入格式為yyyy-mm-dd。以下語(yǔ)句將默認(rèn)格式的字符型數(shù)據(jù)轉(zhuǎn)換為了對(duì)應(yīng)日期
mydates <- as.Date(c("2019-03-13", "2019-01-01"))
# 使用mm/dd/yyyy的格式讀取數(shù)據(jù)
strDates <- c("01/05/2019", "11/22/2020")
dates <- as.Date(strDates, "%m/%d/%Y")
# 轉(zhuǎn)換leadership
myformat <- "%m/%d/%y"
leadership$testDate <- as.Date(leadership$testDate, myformat)
# Sys.Date()可以返回當(dāng)天的日期,而date()則返回當(dāng)前的日期和時(shí)間。
Sys.Date()
date()
# 格式化日期時(shí)間
# 可以使用函數(shù)format(x, format="output_format")來(lái)輸出指定格式的日期值,并且 15 可以提取日期值中的某些部分
today <- Sys.Date()
format(today, format = "%B %d %Y")
# 查看當(dāng)前的星期名
format(today, format="%A")
# R的內(nèi)部在存儲(chǔ)日期時(shí),是使用自1970年1月1日以來(lái)的天數(shù)表示的,更早的日期則表示為負(fù) 數(shù)。這意味著可以在日期值上執(zhí)行算術(shù)運(yùn)算。例如:
startdate <- as.Date("2018-03-13")
enddate <- as.Date("2019-03-14")
days <- enddate - startdate
days
# 也可以使用函數(shù)difftime()來(lái)計(jì)算時(shí)間間隔,并以星期、天、時(shí)、分、秒來(lái)表示。
today <- Sys.Date()
dob <- as.Date("1994-10-02")
difftime(today, dob, units = "weeks")
format(dob, format = "%A")# 4.6.1 將日期轉(zhuǎn)換為字符型變量
strDates <- as.character(dates)# 4.6.2 更進(jìn)一步
help("as.Date")
help("strftime")# 4.7 類型轉(zhuǎn)換
# 類型轉(zhuǎn)換函數(shù):名為is.datatype()這樣的函數(shù)返回TRUE或FALSE,而as.datatype()這樣的函數(shù)則將其參數(shù)轉(zhuǎn)換為對(duì)應(yīng)的類型。
# 判斷 轉(zhuǎn)換
# is.numeric() as.numberic()
# is.character() as.character()
# is.vector() as.vector()
# is.matrix() as.matrix()
# is.data.frame() as.data.frame()
# is.factor() as.factor()
# is.logical() as.logical()
# 代碼清單4-5 轉(zhuǎn)換數(shù)據(jù)類型
a <- c(1, 2, 3)
is.numeric(a) # 輸出:TRUE
is.vector(a) # 輸出:TRUE
# 轉(zhuǎn)為字符串
a <- as.character(a)
a # 輸出:[1] "1" "2" "3"
is.numeric(a) # 輸出:FALSE
is.vector(a) # 輸出:TRUE
is.character(a) # 輸出:TRUE# 4.8 數(shù)據(jù)排序
# 在R中,可以使用order()函數(shù)對(duì)一個(gè)數(shù)據(jù)框進(jìn)行排序。默認(rèn)的排序順序是升序。在排序變量的前邊加一個(gè)減號(hào)即可得到降序的排序結(jié)果。
# 以下示例使用leadership演示了數(shù)據(jù)框的排序
# 創(chuàng)建了一個(gè)新的數(shù)據(jù)集,其中各行依經(jīng)理人的年齡升序排序。語(yǔ)句:
newdata <- leadership[order(leadership$age),]
# 將各行依女性到男性、同樣性別中按年齡升序排序。
attach(leadership)
newdata <- leadership[order(gender, age),]
detach(leadership)
# 將各行依經(jīng)理人的性別和年齡降序排序。
attach(leadership)
newdata <- leadership[order(gender, -age),]
detach(leadership)# 4.9 數(shù)據(jù)集的合并
# 4.9.1 添加列
# 要橫向合并兩個(gè)數(shù)據(jù)框(數(shù)據(jù)集),請(qǐng)使用merge()函數(shù)。在多數(shù)情況下,兩個(gè)數(shù)據(jù)框是通過(guò)一個(gè)或多個(gè)共有變量進(jìn)行聯(lián)結(jié)的(即一種內(nèi)聯(lián)結(jié),inner join)。
# 例如以下代碼將dataframeA和dataframeB按照ID進(jìn)行了合并。
# total <- merge(dataframeA, dataframeB, by = "ID")
# 將兩個(gè)數(shù)據(jù)框按照ID和Country進(jìn)行了合并。類似的橫向聯(lián)結(jié)通常用于向數(shù)據(jù)框中添加變量。
# total <- merge(dataframeA, dataframeB, by = c("ID", "Country")
# 注意 如果要直接橫向合并兩個(gè)矩陣或數(shù)據(jù)框,并且不需要指定一個(gè)公共索引,那么可以直接
# 使用cbind()函數(shù):
# total <- cbind(A, B)
# 這個(gè)函數(shù)將橫向合并對(duì)象A和對(duì)象B。為了讓它正常工作,每個(gè)對(duì)象必須擁有相同的行數(shù), 且要以相同順序排序。
# merge:
total <- merge(leadership, newdata, by = "managerID")
# cbind
total <- cbind(leadership, newdata)# 4.9.2 添加行
# 要縱向合并兩個(gè)數(shù)據(jù)框(數(shù)據(jù)集),請(qǐng)使用rbind()函數(shù):
# total <- rbind(dataframeA, dataframeB)
# 兩個(gè)數(shù)據(jù)框必須擁有相同的變量,不過(guò)它們的順序不必一定相同。如果dataframeA中擁有 dataframeB中沒(méi)有的變量,請(qǐng)?jiān)诤喜⑺鼈冎白鲆韵履撤N處理:
# 刪除dataframeA中的多余變量;
# 在dataframeB中創(chuàng)建愛你追加的變量并將其設(shè)置為NA(缺失值)
# 縱向聯(lián)結(jié)通常用于向數(shù)據(jù)框中添加觀測(cè)
total <- rbind(leadership, newdata)# 4.10 數(shù)據(jù)集取子集
# 4.10.1 選入(保留)變量
# 數(shù) 據(jù)框中的元素是通過(guò)dataframe[row indices, column indices]這樣的記號(hào)來(lái)訪問(wèn)的。例如:
newdata <- leadership[, c(6:10)]
# 從leadership數(shù)據(jù)框中選擇了變量q1、q2、q3、q4和q5,并將它們保存到了數(shù)據(jù)框newdata 中。將行下標(biāo)留空(,)表示默認(rèn)選擇所有行。
myvars <- c("q1", "q2", "q3", "q4", "q5")
newdata <- leadership[myvars]
# 也可以如下的方式實(shí)現(xiàn)(實(shí)現(xiàn)不了,paste函數(shù)有問(wèn)題)
# myvars <- paste("q", 1:5, seq = "")
# nnewdata <- leadership[myvars]# 4.10.2 剔除(丟棄)變量
# 如果某個(gè)變量中有若干缺失值,你可能就想在進(jìn)一步分 析之前將其丟棄。
# 以下是剔除leadership數(shù)據(jù)框中的變量q3和q4
myvars <- names(leadership) %in% c("q3", "q4")
newdata <- leadership[!myvars]
# 以下是對(duì)上面兩句的分析:
# (1) names(leadership)生成了一個(gè)包含所有變量名的字符型向量: c("managerID","testDate","country","gender","age","q1", "q2","q3","q4","q5")。
# (2) names(leadership) %in% c("q3", "q4")返回了一個(gè)邏輯型向量,names(leadership) 中每個(gè) 匹配q3或q4的元素的值為TRUE,反之為FALSE:c(FALSE, FALSE, FALSE, FALSE,FALSE, FALSE, FALSE, TRUE, TRUE, FALSE)。
# (3) 運(yùn)算符非(!)將邏輯值反轉(zhuǎn):c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE,FALSE, TRUE)。
# (4) leadership[c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE,TRUE)]選擇了邏輯值為TRUE的列,于是q3和q4被剔除了。# 在知道q3和q4是第8個(gè)和第9個(gè)變量的情況下,可以使用語(yǔ)句將它們剔除。這種方式的工作原理是,在某一列的下標(biāo)之前加一個(gè)減號(hào)(?)就會(huì)剔除那 一列。
newdata <- leadership[c(-8, -9)]
# 相同的變量刪除工作亦可通過(guò)以下語(yǔ)句完成:
newdata$q1 <- newdata$q2 <- NULL# 4.10.3 選入觀測(cè)
# 選入或剔除觀測(cè)(行)通常是成功的數(shù)據(jù)準(zhǔn)備和數(shù)據(jù)分析的一個(gè)關(guān)鍵方面。
# 代碼清單4-6 選入觀測(cè)
newdata <- leadership[1:3, ]
newdata <- leadership[which(leadership$gender == "M" &leadership$age > 30),]
# 方式二:
attach(leadership)
newdata <- leadership[which(gender == "M" & age > 30),]
detach(leadership)
# 在以上每個(gè)示例中,你只提供了行下標(biāo),并將列下標(biāo)留空(故選入了所有列)。在第一個(gè)示 例中,你選擇了第1行到第3行(前三個(gè)觀測(cè))。
# 在第二個(gè)示例中,你選擇了所有30歲以上的男性。讓我們拆解這行代碼以便理解它。
# (1) 邏輯比較leadership$gender=="M"生成了向量c(TRUE, FALSE, FALSE, TRUE, FALSE)。
# (2) 邏輯比較leadership$age > 30生成了向量c(TRUE, TRUE, FALSE, TRUE, TRUE)。
# (3) 邏輯比較c(TRUE, FALSE, FALSE, TRUE, TRUE) & c(TRUE, TRUE, FALSE, TRUE,TRUE)生成了向量c(TRUE, FALSE, FALSE, TRUE, FALSE)。
# (4) 函數(shù)which()給出了向量中值為TRUE元素的下標(biāo)。因此,which(c(TRUE, FALSE,FALSE, TRUE, FALSE))生成了向量c(1, 4)。
# (5) leadership[c(1,4),]從數(shù)據(jù)框中選擇了第一個(gè)和第四個(gè)觀測(cè)。這就滿足了我們的選取準(zhǔn)則(30歲以上的男性)。# 將研究范圍限定在2009年1月1日到2009年12月31日之間收集的觀測(cè)上。
leadership$testDate <- as.Date(leadership$testDate, "%m/%d/%y")
startdate <- as.Date("2009-01-01")
enddate <- as.Date("2009-12-31")
newdata <- leadership[which(leadership$testDate >= startdate &leadership$testDate <= enddate),]# 4.10.4 subset()函數(shù)
# 選擇了所有age值大于等于35或age值小于24的行,保留了變量q1到q4。
newdata <- subset(leadership, age >= 35 | age < 24,select = c(q1, q2, q3, q4))
# 你選擇了所有25歲以上的男性,并保留了變量gender到q4(gender、q4和其間所有列)
newdata <- subset(leadership, age > 25 & gender == "M",select = gender:q4)# 4.10.5 隨機(jī)抽樣
# sample()函數(shù)能夠讓你從數(shù)據(jù)集中(有放回或無(wú)放回地)抽取大小為n的一個(gè)隨機(jī)樣本。
# 使用以下語(yǔ)句從leadership數(shù)據(jù)集中隨機(jī)抽取一個(gè)大小為3的樣本:
mysample <- leadership[sample(1:nrow(leadership), 3, replace = FALSE), ]
# sample()函數(shù)中的第一個(gè)參數(shù)是一個(gè)由要從中抽樣的元素組成的向量。在這里,這個(gè)向量 是1到數(shù)據(jù)框中觀測(cè)的數(shù)量,第二個(gè)參數(shù)是要抽取的元素?cái)?shù)量,第三個(gè)參數(shù)表示無(wú)放回抽樣。 sample()函數(shù)會(huì)返回隨機(jī)抽樣得到的元素,之后即可用于選擇數(shù)據(jù)框中的行。# 4.11 使用 SQL 語(yǔ)句操作數(shù)據(jù)框
install.packages("sqldf")
# 代碼清單4-7 使用SQL語(yǔ)句操作數(shù)據(jù)框
library(sqldf)
# 從數(shù)據(jù)框mtcars中選擇了所有的變量(列),保留了那些使用化油器 (carb)的車型(行),按照mpg對(duì)車型進(jìn)行了升序排序,并將結(jié)果保存為數(shù)據(jù)框newdf。參數(shù) row.names=TRUE將原始數(shù)據(jù)框中的行名延續(xù)到了新數(shù)據(jù)框中。
newdf <- sqldf("select * from mtcars where carb=1 order by mpg",row.names = TRUE)
# 輸出了四缸和六缸車型每一gear水平的mpg和disp的平均值。
sqldf("select avg(mpg) as avg_mpg, avg(disp) as avg_disp, gearfrom mtcars where cyl in(4, 6) group by gear")
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的《R语言实战》第4章的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《R语言实战》第3章
- 下一篇: 《R语言实战》第6章