R語言實(shí)戰(zhàn)4:基本數(shù)據(jù)管理


title: "R數(shù)據(jù)實(shí)戰(zhàn)4:基本數(shù)據(jù)管理"
author: "wintryheart"
date: "2019年5月17日"
output:
html_document:
toc: TRUE


knitr::opts_chunk$set(echo = TRUE)

第4章 基本數(shù)據(jù)管理

4.1 數(shù)據(jù)集

manager <- c(1: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","M","F","M")
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,5,5,NA,2)
q5 <- c(5,5,2,NA,1)
leadship <- data.frame(manager, date, country, gender, age, q1, q2, q3,q4,q5, stringsAsFactors = FALSE)
leadship

4.2 創(chuàng)建新變量

算術(shù)表達(dá)式

運(yùn)算符 描述
求冪 ^或者**
求余 x%%y
整除 x%/%y
#第一種方式:利用attach()簡化操作
attach(leadship)
leadship$sumq12 = q1+q2
leadship$meanq12 = (q1+q2)/2
detach(leadship)

#第二方式:利用transform()函數(shù)
leadship <- transform(leadship,
                      sumq123 = q1+q2+q3,
                      meanq123 = (q1+q2+q3)/3)

leadship

4.3 變量的重編碼

邏輯表達(dá)式

運(yùn)算符 描述
!= 不等于
!x 非X
x | y x或y
x & y x和y
isTRUE(x) x是否為TRUE
# within()和with()的不同之處在于,within()允許修改數(shù)據(jù)框。  
leadship$age[leadship$age == 99] <- NA  #將99歲的年齡值編碼為缺失值。
leadship <- within(leadship,{
                   agecat <- NA   #創(chuàng)建新變量,賦值為缺失值
                   agecat[age > 75] <- "Elder"    
                   agecat[age >= 55 & age <=75] <- "Middle Aged"
                   agecat[age <55] <-"Yong"})
leadship  
# 利用car包中的recode()函數(shù),和doBy包中的recodevar()函數(shù)更為方便。

4.4 變量重命名

手工修改:fix()函數(shù)調(diào)出交互式操作框

fix(leadship)

笨辦法: names()函數(shù)

names(leadship)[2] <- "textDate"

更好用的方法:plyr包中的rename()函數(shù)

rename(dataframe, c(oldname1="newname1", oldname2="newname2", ... ))

library(plyr)
leadship <- rename(leadship, c(q1="item1", q2="item2",q3="item3",q4="item4",q5="item5"))
leadship

4.5 缺失值

is.na()檢測(cè)缺失值是否存在。

is.na(leadship)
  • 類似缺失值的標(biāo)記與檢測(cè)
標(biāo)記 含義 檢測(cè) 備注
NA 缺失值 is.na()
Inf 正無窮 is.infinite() 5/0返回Inf
-Inf 負(fù)無窮 is.infinite()
NaN 不可能的值 is.nan() sin(Inf)不是一個(gè)數(shù)
  • 在分析中排除缺失值
    • 很多數(shù)值函數(shù)都有na.rm=TRUE選項(xiàng),可以在計(jì)算之移除缺失值,并用剩余值計(jì)算。
    • 通過函數(shù)na.omit()移除所有含有缺失值的觀測(cè)。
x <- c(1, 2, NA, 3)
y <- sum(x)
z <- sum(x, na.rm=TRUE)
print(list(x=x, y=y, z=z))

newdata <- na.omit(leadship)
newdata

4.6 日期值

日期格式

符號(hào) 含義 示例
%d 數(shù)字表示的日期(0~31) 01-31
%a 縮寫的星期名 Mon
%A 非縮寫的星期名 Monday
%m 數(shù)字表示的月份(01~12) 01
%b 縮寫的月份 Jan
%B 非縮寫的月份 January
%y 兩位數(shù)的年份 07
%Y 四位數(shù)的年份 2007
  • 日期的默認(rèn)輸入格式為:yyyy-mm-dd
  • 按指定格式讀?。篴s.Date(object, "myfomats")
  • 按指定格式輸出:format(object, format="output_format")
  • 日期值可以執(zhí)行算術(shù)運(yùn)算。
  • 函數(shù)difftime()可以計(jì)算以星期、天、時(shí)、分和秒表示的時(shí)間間隔,默認(rèn)為天。
  • 日期型轉(zhuǎn)換成字符型:as.character()
#默認(rèn)輸入格式
mydates1 <- as.Date(c("2007-01-09", "2019-03-14"))

#按指定格式讀取
strDates <- c("01/15/1965","05/12/1970")
mydates2 <- as.Date(strDates, "%m/%D/%Y")

#按指定的格式輸出
Sys.Date()
date()
today <- Sys.Date()
format(today, format="%B %d日 %Y年")
format(today, format="%A")

#日期算術(shù)運(yùn)算
startdate <- as.Date("1979-10-22")
enddate <- Sys.Date()
days <- enddate-startdate
days

#計(jì)算時(shí)間間隔
difftime(enddate, startdate)
difftime(enddate, startdate, units="weeks")

4.7 類型轉(zhuǎn)換

類型轉(zhuǎn)換函數(shù)

判斷 轉(zhuǎn)換
is.numeric() as.numeric()
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.8 數(shù)據(jù)排序

  • 使用order()函數(shù)對(duì)數(shù)據(jù)框進(jìn)行排序。默認(rèn)為升序。
  • 在排序變量前加一個(gè)負(fù)號(hào),就變?yōu)榻敌颉?/li>
attach(leadship)

newdata1 <- leadship[order(gender,age),]

newdata2 <- leadship[order(gender, -age),]

print(list(newdata1, newdata2))  #NA比數(shù)字大。

detach(leadship)

4.9 數(shù)據(jù)集合并

合并方向 函數(shù) 說明
添加列 merge() 通過一個(gè)或多個(gè)共有變量聯(lián)結(jié),by="共有變量"
添加列 cbind() 沒有共有變量
添加行 rbind()

4.10 數(shù)據(jù)集取子集

4.10.1 保留變量

myvars <- c("q1","q2","q3","q4","q5")
或者
myvars <- paste("q", 1:5, sep="")

newdatas <- leadship[myvars]

4.10.2 剔除變量

使用邏輯判斷

# names(leadship)生成一個(gè)包含所有變量名的字符型向量。
# %in%返回一個(gè)邏輯型向量,匹配c()中元素的值為TRUE,否則為FASLE。
myvars <- names(leadship) %in% c("sumq12", "meanq12")
# !myvars 反向邏輯判斷。
# sumq12和meanq12被剔除
newdata <- leadship[!myvars]
newdata

# 通過設(shè)為未定義(NULL)來剔除變量
newdata$sumq123 <- newdata$meanq123 <- NULL
newdata

4.10.3 選擇觀測(cè)

  • 方法1:利用行下標(biāo)

newdatas <- leadship[1:3, ]

  • 方法2:利用邏輯判斷篩選

attach(leadship)
newdats <- leadship[gender == "M" & age>30]
detach(leadship)

4.10.4 subset()函數(shù)同時(shí)選擇變量和觀測(cè)

newdata3 <- subset(leadship, age>30, select=c(q1,q2,q3))

newdata4  <-  subset(leadship, age>30 & gender=="M", select=q1:q4)   #支持from:to冒號(hào)運(yùn)算符

print(list(newdata3, newdata4))

4.10.5 隨機(jī)抽樣


#第一個(gè)參數(shù)1:nrow(leadship)確定被抽樣的總體
#第二個(gè)參數(shù)3確定抽樣規(guī)模
#第三個(gè)參數(shù)replace=FALSE表示無放回抽樣。
mysample <- leadship[sample(1:nrow(leadship), 3, replace=FALSE)]

mysample

#更復(fù)雜的抽樣工具參見sampling包和survey包。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們的掌握目標(biāo): ●操縱日期和缺失值 ●熟悉數(shù)據(jù)類型的轉(zhuǎn)換 ●變量的創(chuàng)建和重編碼 ●數(shù)據(jù)集的排序、合并與取并集 ●...
    小白日常筆記閱讀 887評(píng)論 0 0
  • 基本數(shù)據(jù)管理 在前面的章節(jié)中,我們討論了多種導(dǎo)入數(shù)據(jù)到R中的方法。遺憾的是,將你的數(shù)據(jù)表示為矩陣或數(shù)據(jù)框這樣的矩形...
    jplee閱讀 1,801評(píng)論 0 2
  • 為了解決感興趣的問題,我們首先必須解決一些數(shù)據(jù)管理方面的問題。 4.2 創(chuàng)建新變量 在典型的研究項(xiàng)目中,你可能需要...
    在雨中跳舞閱讀 1,841評(píng)論 2 1
  • 數(shù)據(jù)分析中最重要的并不是如何敲代碼,如何收集數(shù)據(jù),而是數(shù)據(jù)分析前的準(zhǔn)備——數(shù)據(jù)導(dǎo)入,數(shù)據(jù)框架的構(gòu)建、數(shù)據(jù)的基礎(chǔ)處理...
    白馬少年說閱讀 2,144評(píng)論 5 7
  • 由于剛接觸Linux不久,安裝各種各樣的插件都出許多問題! 1.在安裝mysql后,可能啟動(dòng)不了 比如:Can't...
    Lenvaco1998閱讀 246評(píng)論 0 0

友情鏈接更多精彩內(nèi)容