R语言学习笔记——入门篇:第四章-基本数据管理
Sys.setenv(LANGUAGE = "en")
options(stringsAsFactors = F)
rm(list = ls())
setwd("C:/Users/16748/Desktop/R语言学习/R")
manager <- c(1,2,3,4,5)
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")
age <- c(32,45,25,39,99)
gender <- c("M","F","F","M","F")
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)
leadership <- data.frame(manager,date,country,
gender,age,q1,q2,q3,q4,q5)
变量名 <- 表达式
# 表达式可以包含多种运算符和函数
算数运算符 | 功能 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除 |
^或** | 求幂 |
x%%y | 求余 |
x%/%y | 整数除法(只取整数位),如5.5%/%2=2 |
变量名 <- transform(数据框名,变量名 = 表达式)
x <- data.frame(x1 = c(1,2,3,4),
x2 = c(4,3,2,1))
# 方法一
x$sum <- x$x1 + x$x2
# 方法二
attach(x)
x$sum <- x1 + x2
detach(x)
# 方法三
x <- transform(x,sum = x1 + x2)
逻辑运算符 | 功能 |
---|---|
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
== | 等于 |
!= | 不等于 |
!x | 非x |
x I y | x或y |
x & y | x和y |
isTRUE(x) | 测试x是否为TRUE |
# 将99岁的年龄重编码为缺失值
leadership$age[leadership$age ==99] <- NA
# variable[condition] <- expression将仅在condition的值为TRUE时执行
# 希望将年龄值按照不同年龄段分类
leadership <- within(leadership,{
age[age == 99] <- NA
agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 35 & age <= 75] <- "Middle Aged"
agecat[age < 35 ] <- "Young"
agecat <- factor(agecat,levels = c("Elder","Middle Aged","Young"),ordered = T)
})
有两种方式进行变量重命名
fix(数据框名)
此函数会调用出一个交互式编辑器,然后直接单击变量名就可以重命名。
示例:
结果:
names( )
rename( )# 属于plyr包
names(数据框名)[需要修改变量的列(数值)] <- "修改后的名字"
rename(dataframe,c(oldname1="newname1",oldname2="newname2",...))
names(leadership)[2] <- "testDate"
leadership <- rename(leadership,c(manager = "managerID",date = "testDate"))
如 三、变量的重编码 演示一般
x <- c(1,2,NA,4)
y <- sum(x,na.rm = T)
newdata <- na.omit(leadership)
as.Date(x,"input_format")
# x为字符串数据
# input_format为日期格式参数
符号 | 含义 | 示例 |
---|---|---|
%d | 天数day(数字) | 01-31 |
%a | 星期名(缩写) | Mon-Sun |
%A | 星期名(全称) | Monday-Sunday |
% m | 月份(数字) | 01-12 |
% b | 月份(缩写) | Jan-Dec |
% B | 月份(全称) | January-December |
%y | 年份(2位数) | 22 |
%Y | 年份(4位数) | 2022 |
> date1 <- as.Date("1956-10-12")
> date1
[1] "1956-10-12"
> Dates <- c("01/05/1965","02/05/2000")
> myformat <- "%m/%d/%Y"
> dates <- as.Date(Dates,myformat)
> dates
[1] "1965-01-05" "2000-02-05"
Sys.Date()
# 返回当天的日期
date()
# 返回当前的具体时间
format(TimeData,input_format)
# 将输入的TimeData日期变量,按照input_format日期格式输出
difftime(TimeData1,TimeData2,units = "")
# 计算时间间隔(星期,天,时,分,秒),可以存在负数
# 示例
> Sys.Date()
[1] "2022-12-03"
> # 返回当天的日期
> date()
[1] "Sat Dec 3 17:51:32 2022"
> # 计算时间间隔(星期,天,时,分,秒)
> format(as.Date("1956-10-12"),"%A")
[1] "星期五"
> difftime(as.Date("1956-10-12"),as.Date("2022-12-3"),units = "weeks")
Time difference of -3451.143 weeks
# 了解字符型数据转为日期的更多细节
help(as.Date)
help(strftime)
# 查看日期与时间格式
help(ISOdatetime)
# 简化日期处理的函数,用于识别解析日期-时间数据,抽取日期-时间成分(如年份,月份等),对日期-时间进行算数运算
lubridate
# 进行复杂的日期运算包,处理多时区,历法操作,支持工作日假期等。
timeDate
函数 | 类型 |
---|---|
is.numeric() / as.numeric | 数值型 |
is.character() | 字符型 |
is.logical() | 逻辑型 |
is.vector() | 向量 |
is.matrix() | 矩阵 |
is.array() | 数组 |
is.data.frame() | 数据框 |
is.factor() | 因子 |
is.list() | 列表 |
# 对行排序,先按照女性到男性的顺序,同性别中按年龄降序排序。
> newdate <- leadership[order(leadership$gender,-leadership$age),]
> newdate
managerID testDate country gender age q1 q2 q3 q4 q5
5 5 5/1/09 UK F 99 2 2 1 2 1
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
1 1 10/24/08 US M 32 5 4 5 5 5
向数据框中添加行或列
有两种函数可以实现该目的
x <- merge(dateframe1,dateframe2,by = "变量名")
x <- merge(dateframe1,dateframe2,by = c("变量名1","变量名2"..))
对象:横向合并两个数据框(数据集),根据一个或多个变量进行联结。
函数:cbind()
语法:
x <- cbind(A,B)
x <- merge(dateframe1,dateframe2,by = "变量名")
x <- merge(dateframe1,dateframe2,by = c("变量名1","变量名2"..))
> newdata <- leadership[,c(6:10)]
> newdata
q1 q2 q3 q4 q5
1 5 4 5 5 5
2 3 5 2 5 5
3 3 5 5 5 2
4 3 3 4 NA NA
5 2 2 1 2 1
> x <- names(leadership) %in% c("q3","q4")
> x
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE
> newdata <- leadership[!x]
> newdata
managerID date country gender age q1 q2 q5
1 1 10/24/08 US M 32 5 4 5
2 2 10/28/08 US F 45 3 5 5
3 3 10/1/08 UK F 25 3 5 2
4 4 10/12/08 UK M 39 3 3 NA
5 5 5/1/09 UK F 99 2 2 1
> newdata <- leadership[1:3,]
> newdata <- leadership[leadership$gender == "M" & leadership$age >30,]
> newdata
managerID date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
4 4 10/12/08 UK M 39 3 3 4 NA NA
subset(dateframe,condition,select = c())
# dateframe为数据集
# condition为筛选条件
# select里面为保留的变量名
x <- subset(leadership,age >=35 | age <=24 ,select = c(q1,q2,q3,q4))
x <- subset(leadership,gender =="M" | age > 24 ,select = gender:q4)
# 保留了变量gender到q4及其之间的列
sample(x,n,replace = T/F)
# x为抽样的范围
# n为抽样的数量
# replace表示有(T)无(F)放回抽样
x <- leadership[sample(1:nrow(leadership),,replace = T),]
install.packages("sqldf")
library(sqldf)
dateframe <- sqldf("select * from x",row.names = T)