数据整理
无论是输入外部数据还是R本身写入的数据,斗殴要经过处理才能使我们更好的分析。在我们做诗句处理前,先了解一下R中的算术运算符和逻辑运算符。
算术运算符:就是加减乘除类的符号。
逻辑运算符:表示判断的符号。
1. 算术运算符如下:
2.逻辑运算符如下:
一. 数据表的修改
首先我们定义一组数据:
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, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
leadership <- data.frame(manager, date, country, gender, age,
q1, q2, q3, q4, q5, stringsAsFactors=FALSE)
leadership
str(leadership)
数据的增删改查
# 数据框添加新列和删除新列
leadership$sum = leadership$q1+leadership$q2+leadership$q3+leadership$q4+leadership$q5 # 方法一
leadership = transform(leadership, sumx = q1 + q2, meanx = (q1 + q2)/2) # 方法二
# 根据逻辑判断来添加新列
leadership$age_class[leadership$age > 75] = "elder"
leadership$age_class[leadership$age >= 55 & leadership$age <= 75] = "middle aged"
leadership$age_class[leadership$age < 55] = "young"
# 删除某一列或者行
leadership = leadership[-5,] # 删除第五行
leadership = leadership[,-1] # 删除第一列
leadership = leadership[-c(1:3),] # 可以删除多行
# 修改数据框中的值
leadership$q1 = c(1,2,3,4,5) # 修改整列的值
leadership$q1[1] = 10 # 修改表中的元素
leadership$age[ leadership$age >= 80 ] = NA # 根据逻辑判断来修改数据框中的值
# with 和 within 很相似,但是within允许修改数据框,而with是不允许修改内容的
leadership = within(leadership,{
agecat = NA
agecat[age > 75] = "Elder"
agecat[age >= 55 & age <= 75] = "Middle Aged"
agecat[age < 55] = "Young" })
# 修改数据框中的行和列的名字(也可以使用plyr包中的rename()函数)
fix(leadership) # 直接在R编辑器中修改
names(leadership)[1] = "haha" # 通过names() 函数修改列名
names(leadership)[1:3] = c("ni","wo","you")
rownames(leadership)[1] = "hahha" # 修改行的名字
# 缺失值的处理
is.infinite() # 判断是否为无穷
is.nan() # 判断是不是数字
is.na(leadership) # 判断是否为缺失值
# 与缺失值的计算最后都是缺失值
x = c(1,2,NA,4)
y = x[1]+x[2]+x[3]
z = sum(x)
w = sum(x,na.rm = TRUE) # 对缺失值的处理
# na.omit() 删除具有缺失值的行
newdata = na.omit(leadership)
日期的处理
有时候我们再处理数据的时候,要注意日期的格式也会对数据分析造成影响。
下面是日期的格式:
# 日期值的处理 as.Date(x, "input_format"),其中x是字符型数据,input_format则给出了用于读入日期的适当格式
strDates <- c("01/05/1965", "08/16/1975")
dates <- as.Date(strDates, "%m/%d/%Y")
leadership$date = as.Date(leadership$date,"%m/%d/%Y")
# 获得当前日期
Sys.Date()
date()
# 格式化输出日期
today = Sys.Date()
format(today, format="%b/%d/%Y")
format(today, format="%b/%d--------%Y")
format(today, format="%A")
数据类型判断以及转换
在处理数据的时候,常常需要转换数据,因为非数值型数据是不能运算的。接下来我们就介绍数据类型判断以及数据的转换。
# 这里很简单,就简单介绍
a = c(1,2,3)
typeof(a) # 打印出数据的类型
is.numeric(a) # 判断是否为数值型
a = as.character(a) # 转换为字符
is.numeric(a)
数据排序 order()
# 数据排序
# 以gender进行排序,然后再gender中又以年龄从小到大排序
leadership_new = leadership[order(leadership$gender,leadership$age),]
# 前面加个负号就是从大到小排序
# 先将leadership以gender进来排序, gender内部再以age进行排序
leadership_new = leadership[order(leadership$gender,-leadership$age),]
示例
# 数据实战
# 1. 挑选出年龄30岁以上的男性的行
# 2. 挑选出2009年1月1日到2009年12月31日之间的行
data_1 = leadership[leadership$gender == "M"
& leadership$age >30,]
# 日期一定要格式化之后才能比较
leadership$date = as.Date(leadership$date,"%m/%d/%y")
startdate = as.Date("2009-01-01")
enddate = as.Date("2009-10-31")
data_2 = leadership[leadership$date >startdate & leadership$date < enddate,]
在数据中常用的两个函数
# 子集的挑选subset(数据集,条件,select = 要展示的数据)函数
# 选中airquality中的temp大于70的对应的Ozone, Temp的值
v = airquality
c = subset(v, Temp > 70, select = c(Ozone, Temp))
# 抽样sample()
# 从airquality中随机抽取5行数据,不重复
sample_1 = airquality[sample(1:nrow(airquality),5,replace = FALSE),]
# 从airquality中随机抽取3列数据,不重复
sample_2 = airquality[,sample(1:ncol(airquality),3,replace = FALSE)]
代码(附)
所有代码如下:
getwd()
setwd("D:/D/my_files/r/r语言实战")
# 数据管理
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, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
leadership <- data.frame(manager, date, country, gender, age,
q1, q2, q3, q4, q5, stringsAsFactors=FALSE)
# 数据框添加新列和删除新列
leadership$sum = leadership$q1+leadership$q2+leadership$q3+leadership$q4+leadership$q5 # 方法一
leadership = transform(leadership, sumx = q1 + q2, meanx = (q1 + q2)/2) # 方法二
# 根据逻辑判断来添加新列
leadership$age_class[leadership$age > 75] = "elder"
leadership$age_class[leadership$age >= 55 & leadership$age <= 75] = "middle aged"
leadership$age_class[leadership$age < 55] = "young"
# 删除某一列或者行
leadership = leadership[-5,] # 删除第五行
leadership = leadership[,-1] # 删除第一列
leadership = leadership[-c(1:3),] # 可以删除多行
leadership$manager = NULL # 删除manager这一列
# 取数据集的子集,其实也就是删除某些列
qq = names(leadership) %in% c("q1","q2")
leadership = leadership[!qq]
# 修改数据框中的值
leadership$q1 = c(1,2,3,4,5) # 修改整列的值
leadership$q1[1] = 10 # 修改表中的元素
leadership$age[ leadership$age >= 80 ] = NA # 根据逻辑判断来修改数据框中的值
# with 和 within 很相似,但是within允许修改数据框,而with是不允许修改内容的
leadership = within(leadership,{
agecat = NA
agecat[age > 75] = "Elder"
agecat[age >= 55 & age <= 75] = "Middle Aged"
agecat[age < 55] = "Young" })
# 修改数据框中的行和列的名字(也可以使用plyr包中的rename()函数)
fix(leadership) # 直接在R编辑器中修改
names(leadership)[1] = "haha" # 通过names() 函数修改列名
names(leadership)[1:3] = c("ni","wo","you")
rownames(leadership)[1] = "hahha" # 修改行的名字
# 缺失值的处理
is.infinite() # 判断是否为无穷
is.nan() # 判断是不是数字
is.na(leadership) # 判断是否为缺失值
# 与缺失值的计算最后都是缺失值
x = c(1,2,NA,4)
y = x[1]+x[2]+x[3]
z = sum(x)
w = sum(x,na.rm = TRUE) # 对缺失值的处理
# na.omit() 删除具有缺失值的行
newdata = na.omit(leadership)
leadership
str(leadership)
# 日期值的处理 as.Date(x, "input_format"),其中x是字符型数据,input_format则给出了用于读入日期的适当格式
strDates <- c("01/05/1965", "08/16/1975")
dates <- as.Date(strDates, "%m/%d/%Y")
leadership$date = as.Date(leadership$date,"%m/%d/%Y")
# 获得当前日期
Sys.Date()
date()
# 格式化输出日期
today = Sys.Date()
format(today, format="%b/%d/%Y")
format(today, format="%b/%d--------%Y")
format(today, format="%A")
# 数据类型判断和转换
a = c(1,2,3)
typeof(a) # 打印出数据的类型
is.numeric(a) # 判断是否为数值型
a = as.character(a) # 转换为字符
is.numeric(a)
a
# 数据排序
# 以gender进行排序,然后再gender中又以年龄从小到大排序
leadership_new = leadership[order(leadership$gender,leadership$age),]
# 前面加个负号就是从大到小排序
leadership_new = leadership[order(leadership$gender,-leadership$age),]
# 数据集的合并
merge()
cbind() # 按照列合并数据
rbind() # 按照行合并数据
# 数据实战
# 1. 挑选出年龄30岁以上的男性的行
# 2. 挑选出2009年1月1日到2009年12月31日之间的行
data_1 = leadership[leadership$gender == "M"
& leadership$age >30,]
# 日期一定要格式化之后才能比较
leadership$date = as.Date(leadership$date,"%m/%d/%y")
startdate = as.Date("2009-01-01")
enddate = as.Date("2009-10-31")
data_2 = leadership[leadership$date >startdate & leadership$date < enddate,]
# 子集的挑选subset(数据集,条件,select = 要展示的数据)函数
# 选中airquality中的temp大于70的对应的Ozone, Temp的值
v = airquality
c = subset(v, Temp > 70, select = c(Ozone, Temp))
# 抽样sample()
# 从airquality中随机抽取5行数据,不重复
sample_1 = airquality[sample(1:nrow(airquality),5,replace = FALSE),]
# 从airquality中随机抽取3列数据,不重复
sample_2 = airquality[,sample(1:ncol(airquality),3,replace = FALSE)]