美文网首页
R语言实战4:基本数据管理

R语言实战4:基本数据管理

作者: 冬之心 | 来源:发表于2019-05-17 17:52 被阅读0次

title: "R数据实战4:基本数据管理"
author: "wintryheart"
date: "2019年5月17日"
output:
html_document:
toc: TRUE


knitr::opts_chunk$set(echo = TRUE)

第4章 基本数据管理

4.1 数据集

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 创建新变量

算术表达式

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

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

leadship

4.3 变量的重编码

逻辑表达式

运算符 描述
!= 不等于
!x 非X
x | y x或y
x & y x和y
isTRUE(x) x是否为TRUE
# within()和with()的不同之处在于,within()允许修改数据框。  
leadship$age[leadship$age == 99] <- NA  #将99岁的年龄值编码为缺失值。
leadship <- within(leadship,{
                   agecat <- NA   #创建新变量,赋值为缺失值
                   agecat[age > 75] <- "Elder"    
                   agecat[age >= 55 & age <=75] <- "Middle Aged"
                   agecat[age <55] <-"Yong"})
leadship  
# 利用car包中的recode()函数,和doBy包中的recodevar()函数更为方便。

4.4 变量重命名

手工修改:fix()函数调出交互式操作框

fix(leadship)

笨办法: names()函数

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

更好用的方法:plyr包中的rename()函数

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()检测缺失值是否存在。

is.na(leadship)
  • 类似缺失值的标记与检测
标记 含义 检测 备注
NA 缺失值 is.na()
Inf 正无穷 is.infinite() 5/0返回Inf
-Inf 负无穷 is.infinite()
NaN 不可能的值 is.nan() sin(Inf)不是一个数
  • 在分析中排除缺失值
    • 很多数值函数都有na.rm=TRUE选项,可以在计算之移除缺失值,并用剩余值计算。
    • 通过函数na.omit()移除所有含有缺失值的观测。
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 日期值

日期格式

符号 含义 示例
%d 数字表示的日期(0~31) 01-31
%a 缩写的星期名 Mon
%A 非缩写的星期名 Monday
%m 数字表示的月份(01~12) 01
%b 缩写的月份 Jan
%B 非缩写的月份 January
%y 两位数的年份 07
%Y 四位数的年份 2007
  • 日期的默认输入格式为:yyyy-mm-dd
  • 按指定格式读取:as.Date(object, "myfomats")
  • 按指定格式输出:format(object, format="output_format")
  • 日期值可以执行算术运算。
  • 函数difftime()可以计算以星期、天、时、分和秒表示的时间间隔,默认为天。
  • 日期型转换成字符型:as.character()
#默认输入格式
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")

#日期算术运算
startdate <- as.Date("1979-10-22")
enddate <- Sys.Date()
days <- enddate-startdate
days

#计算时间间隔
difftime(enddate, startdate)
difftime(enddate, startdate, units="weeks")

4.7 类型转换

类型转换函数

判断 转换
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 数据排序

  • 使用order()函数对数据框进行排序。默认为升序。
  • 在排序变量前加一个负号,就变为降序。
attach(leadship)

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

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

print(list(newdata1, newdata2))  #NA比数字大。

detach(leadship)

4.9 数据集合并

合并方向 函数 说明
添加列 merge() 通过一个或多个共有变量联结,by="共有变量"
添加列 cbind() 没有共有变量
添加行 rbind()

4.10 数据集取子集

4.10.1 保留变量

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

newdatas <- leadship[myvars]

4.10.2 剔除变量

使用逻辑判断

# names(leadship)生成一个包含所有变量名的字符型向量。
# %in%返回一个逻辑型向量,匹配c()中元素的值为TRUE,否则为FASLE。
myvars <- names(leadship) %in% c("sumq12", "meanq12")
# !myvars 反向逻辑判断。
# sumq12和meanq12被剔除
newdata <- leadship[!myvars]
newdata

# 通过设为未定义(NULL)来剔除变量
newdata$sumq123 <- newdata$meanq123 <- NULL
newdata

4.10.3 选择观测

  • 方法1:利用行下标

newdatas <- leadship[1:3, ]

  • 方法2:利用逻辑判断筛选

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

4.10.4 subset()函数同时选择变量和观测

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

newdata4  <-  subset(leadship, age>30 & gender=="M", select=q1:q4)   #支持from:to冒号运算符

print(list(newdata3, newdata4))

4.10.5 随机抽样


#第一个参数1:nrow(leadship)确定被抽样的总体
#第二个参数3确定抽样规模
#第三个参数replace=FALSE表示无放回抽样。
mysample <- leadship[sample(1:nrow(leadship), 3, replace=FALSE)]

mysample

#更复杂的抽样工具参见sampling包和survey包。

相关文章

网友评论

      本文标题:R语言实战4:基本数据管理

      本文链接:https://www.haomeiwen.com/subject/hjaoaqtx.html