R语言


第四章 基本数据管理

用到的数据

leadership


mydata



1. stringAsFactor=FALSE  字符不转换为因子(创建数据框选项参数)

       a) 如: > leadership <- data.frame(变量1,变量2,……, stringAsFactors=FALSE)


2. 创建新变量

a) 变量名 <- 表达式

i. 表达式可包含多种运算符和函数

ii. +  -  *  /

iii. X%%Y(求余) X%/%Y(整数除法)

b) 以下得到的为独立变量

i. > sumx <- mydata$x1 + mydata$x2

ii. > meanx <- (mydata$x1 + mydata$x2)/2

c) 将变量整合的原始数据框中

i. 方法1

1. > mydata$sumx <- mydata$x1 + mydata$x2

2. > mydata$meanx <- (mydata$x1 + mydata$x2)/2

ii. 方法2(绑定数据框,简化代码)

1. > attach(mydata)

> mydata$sumx <- x1 + x2

> mydata$meanx <- (x1 + x2)/2

> detach(mydata)

iii. 方法3(使用 transform()

1. > mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1+x2)/2)


3. 变量的重编码

a) 逻辑运算符

i. <  <=  >  >=  ==(严格等于)  !=(不等于)  x|y(x或y)  x&y(x和y) 

ii. isTRUE(x)  测试x是否为TRUE

b) 实例

i. 将leadership中的年龄(99)替换为NA,年龄99为错误值

1. leadership$age[leadership$age == 99] <- NA

ii. 将leaderhip中age(连续型变量)重新编码为类别型变量 agecat

1. “Elder”: age >= 66; “Middle Aged”: age >40 & age <66;  “Young”: age >= 18 & age <=40;

2. 方法1

a) > leadership$agecat[leadership$age > 66] <- “Elder”

> leadership$agecat[leadership$age > 40 & leadership$age <66] <- “Middle Aged”

> leadership$agecat[leadership$age >= 18 & leadership$age <= 40] <- “Young”

3. 方法2  使用 within()

a) > leadership <- within(leadership, {agecat <- NA

agecat[age>=66] <- “Elder”

agecat[age>40 & age<66] <- “Middle Aged”

agecat[age>=18 & age<=40] <- “Young”})

c) 程序包中的变量重编码函数

i. car包中的 recode()

1. 可以重编码数值型,字符型,向量或因子

ii. doBy包中的 recodevar()

iii. R中自带的 cut()

1. 可以将一个数值型变量按值域切割为多个区间,并返回一个因子


4. 变量的重命名

a) 交互式修改,编辑器

i. fix(object)

b) 编程方法

i. names() 

ii. 实例

> names(leadership)[2] <- “testDate” 修改leadership第二列名

>names(leadership)[1:5]<-c(“item1”,”item2”,”item3”,”item4”,”item5”)

leadership 第一到五列分别重名为 item1,…,item5

c) Plyr包中的 rename() 函数

i. > rename(dataframe, c(oldname=”newname”,oldname=”newname”,……))


5. 缺失值 NA

a) NA (Not Avaliable) 在R中数值型和字符型缺失值都用NA表示

i. 缺失值NA判断:is.na(object)

b) 在R中,无限的或者不可能出现的数值不标记为缺失值NA

c) 可使用赋值语句将某些值重新编码为缺失值(如将leadership中年龄99编码为缺失值)

i. 正无穷大:+∞  识别: is.infinite()

ii. 负无穷大:-∞    识别: is.infinite()

iii. 不可能出现的值(如2/0):NaN  识别: is.nan()

d) na.rm=TRUE 大多数数值型函数都有此选项,移除缺失值,并使用剩余值进行计算

e) na.omit(  )  移除所有含有缺失值的观测(行),缺失值较少或较集中时使用


6. 日期值

a) 日期值通常以字符串(character)形式输入到R中,然后转化为以数值(numeric)形式存储的日期变量

b) as.Date() 用于执行这种转化

i. as.Date(x, “input_format”)  x:字符型向量  input_format:读入日期的格式

ii. 日期值的默认读入格式为:yyyy-mm-dd (如:2018-01-22)

> mydate <- as.Date(c(“2018-01-18”,”2018-01-22”))

因为“2018-01-18”,”2018-01-22”与默认格式相同,直接读入即可

c) 日期格式

符号 含义 实例

%d 两位数表示的日期(01-31) 01 - 31

%a 缩写的星期名 周一

%A 非缩写的星期名 星期一

%m 两位数表示的月份(00-12) 00-12

%b 缩写的月份 一月

%B 非缩写的月份 一月

%y 两位数的年份 18

%Y 四位数的年份 2018

d) 实例:读入日期 “01/05/1991””12/05/1992”

i. > date <- c(“01/05/1991”,”12/05/1992”)

> dates <- as.Date(date, “%m/%d/%Y”)

e) 日期函数

i. Sys.Date()  返回当天日期 如:”2018-01-18”

ii. date()  返回系统当前时间戳 如:”Thu Jan 18 22:11:14 2018”

f) format()

i. format(x, format=”output_format”)

ii. format() 可接受一个参数,并按某种格式输出结果,可用于提取日期值中的某些成分

iii. 实例

1. > today <- Sys.Date()

> format(today, format=”%B%d%Y”)

[1] "一月182018"

> format(today, format=”%A”

[1] "星期四"

iv. R的内部在存储日期时,是使用自1970年1月1日以来的天数表示的,更早的日期用复数表示

1. 因此日期值可以执行算术运算

2. 可使用 difftime() 来计算时间间隔

a) difftime(x1, x2, units=”days”)

b) units: weeks days hour mins secs

c) 实例:计算 Evan 与 HR 生日相差天数

> HR <- c(“1992-12-05”)

> Evan < c(“1991-10-08”)

> difftime(HR, Evan, units=”days”)

Time difference of 447 days


7. 将日期转换为字符型变量(character)

a) as.charavter() 

i. > strDates <- as.character(dates)

b) 进行转换后,即可使用一系列字符处理函数(如:取子集,替换,联接等)

c) 查看帮助: help(as.date)  help(strftime)

d) 日期和时间格式: help(ISOdatetime)

e) 相关包: lubtidate包  timeDate包


8. 数据类型转换

a) 数据类型

数据符号 数据类型

numeric 数值

character 字符(需带””)

vector 向量

matrix 矩阵

data.frame 数据框

factor 因子

logical 逻辑值

b) 数据类型转换函数

判断 转换

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()

is.datetype() as.datetype()

返回逻辑值 TRUE或FALSE 将参数转化为对应的数据类型


9. 数值排序

a) order() 

i. 可对一个数据进行排序(默认为升序,在变量前加减号-即可得到降序结果)

ii. 实例

> newdata1 <- leadership[order(leadership$age), ]

> attach(leadership)

> newdata2 <- leadership[order(gender,age), ]

> newdata3 <- leadership[order(gender,-age), ]

> detach(leadership)


10. 数据集的合并

a) 向数据框(data.frame)添加列(变量)和行(观测)的方法

b) 横向合并,向数据框添加列(变量)

i. 横向合并两个数据框(集),即内联结(inner join),merge()

1. merge(x1, x2, by=”c”)

2. x1 x2为数据集,”c”为公共索引(键)

3. 实例

> total1 <- merge(dataframeA, dataframeB, by=”ID”)

> total2 <- merge(dataframeA, dataframeB, by=c(“ID, “country”))

ii. 直接合并两个数据框或矩阵(不需要公共索引),cbind()

1. > total <- cbind(A, B)

a) 对象A,对象B必须拥有相同的行数

b) 且对象A,对象B以同顺序排序

c) 纵向合并,向数据框添加行(观测),rbind()

i. > total <- rbind(dataframeA, dataframeB)

ii. dataframeA  dataframeB 必须拥有相同的数量

1. 若dataframeA  dataframeB变量不同

a) 删除多余变量

b) 追加变量


11. 数据集取子集

a) 选入(保留)变量

i. dataframe[row indices(行数), column indices(列数) ]

> newdata <- leadership[ , c(6:10)]  #选入leadership 6至10列

> myvars <- c(“q1”,”q2”,”q3”,”q4”,”q5”)

> newdata <- leadership[myvars] #选入leadership q1-q5变量(使用变量名称)

ii. paste() 字符连接函数

1. > myvars <- paste(“q”,1:5,sep=””,)

> newdata <- leadership(myvars)

b) 删除(丢弃)变量

i. > myvars <- names(leadership) %in% c(“q3”,”q4”)

> newdata <- leadership[!myvars]

# names(leadership) 生成了一个含有leadership所有变量名的字符型向量

#names(leadership) %in% c(“q3”,”q4”),返回一个逻辑型向量,names(leadership中每个匹配q3或q4的元素的值为TRUE,反正为FALSE

# !myvars 反转myvars 逻辑值

# newdata <- leadership[!myvars] ,选择逻辑值为TRUE的列,即删除 q3 q4(q3, q4逻辑值为FALSE)

c) 选入观测(行)

i. > newdata1 <- leadership[1:3, ]  #选入leadership 1至3行

ii. > newdata2 <- leadership[leadership$gender=”M”& leadership$age>30,]

iii. > attach(leadership)

> newdata3 <- leadership[gender=”M”& age>30, ]

>detach(leadership)

iv. 限定时间

> leadership$date <- ad.Date(leadership$date, “%m/%d/%y”)  #读入日期

> startdate <- as.Date(“2017-01-01”)  #创建开始日期

> enddate <- as.Date(“2017-12-31”)  #创建结束日期

> newdata <- leadership[which(leadership$date >= startdate & leadership$date <= enddate), ]  #选取满足要求的日期

v. subset()

1. 使用subset() 函数是选择变量和观测的简单方法

2. >newdata1<-subset(leadership,age>=35|age<24, select=c(q1,q2,q3,q4,q5))

>newdata2 <- subset(leadership, gender=”M” & age>25,

select=gender:q4)

d) 随机抽样

i. sample() 可以从数据集中(有放回(raplace=TRUE)或无放回(repalce=FALSE)地抽取一个大小为n的随机样本

1. > mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE), ]

ii. sampling包:抽取和校正调查样本

iii. survery包:分析复杂调查数据

iv. 自助法,重新抽样统计方法


12. 使用SQL语句操作数据框

a) SQL: Structured Query Language 结构化查询语言

b) 需要安装 sqldf 包: install.packages(sqldf)

i. 实例1

> library(sqldf)

> newdf <- sqldf(“select * from mtcars where carb=1 order by mpg”,

  row.names=TRUE)  #row.names=TRUE 延用原始数据框行名

ii. 实例2

> sqldf(“select avg(mpg) as avg_mpg, avg(disp) as avg_disp, gear from

  mtcars where cyl in (4,6) group by gear”)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容