4.1 数据集代码
建立示例数据:
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)
4.2 创建新变量
示例:在数据框mydata计算和和平均
mydata<-data.frame(x1 = c(2, 2, 6, 4), x2 = c(3, 4, 2, 8)) # 第一种方式: mydata$meanx <- (mydata$x1 + mydata$x2)/2 # 第二种方式: attach(mydata) mydata$meanx <- (x1 + x2)/2 detach(mydata)
# 第三种方式:(推荐)
mydata <- transform(mydata, meanx = (x1 + x2)/2)
推荐使用transform()函数进行数据框内的创建新变量运算。
4.3 变量的重编码
1)将连续变量修改为一组类别值;
2)将误编码替换为正确值;
3)基于一组条件进行逻辑判断变量;
4)逻辑运算:
!= 不等于; == 严格等于(慎用); ! 非; | 或;& 和
isTRUE(x) 判断x是否为TRUE
完成以下重编码任务:
将leadership$age == 99 为缺失值,大于75岁为Elder,小于55岁为Young,中间为Middle Aged。
1)leadership$age[leadership$age == 99] <- NA leadership$agecat[leadership$age > 75] <- "Elder" leadership$agecat[leadership$age >= 55 & leadership$age <= 75] <- "Middle Aged" leadership$agecat[leadership$age < 55] <- "Young" 2)leadership$age[leadership$age == 99] <- NA leadership <- within(leadership,{ agecat[age == 99] <- NA agecat[age > 75] <- "Elder" agecat[age >= 55 & age <= 75] <- "Middle Aged" agecat[age < 55] <- "Young" })
within()可以认为是数据框版本的with(),将每一行都设置为缺失值,然后按条件赋值(字符型变量,还不是有序因子)。
4.4 变量的重命名
1)使用 fix() 函数可以弹出“交互式编辑器”方便进行直接更改;
2)使用编程方式可以使用 names()函数来重命名变量:
names(leadership) [1] "manager" "date" "country" "gender" "age" "q1" "q2" [8] "q3" "q4" "q5" names(leadership)[2] <- "testDate" 也可以用类似的向量方式批量修改 names(leadership)[6:10] <- c("item1", "item2", "item3", "item4", "item5") plyr包中有一个rename(dataframe,c(oldname="newname",...)函数进行,后面写。
4.5 缺失值
R中的字符型缺失值与数值型数据使用的缺失值符号是相同的。缺失值以符号NA(Not Available,不可用)表示。
4.5.1 函数is.na()检测缺失值是否存在(存在为TRUE)。
is.na(leadership[,8:10])
注:缺失值是不可比较的,意味着无法使用比较运算符来检测缺失值是否存在。($ == NA 错误)
不可能的值用NaN来标记(Not a number,不是一个数),用is.nan(),例如:sin(Inf)
4.5.2 重编码某些值为缺失值
leadership$age[leadership$age == 99] <- NA
需要在分析之前将所有的缺失数据正确的标记为缺失值,才能不影响分析过程。
4.5.3 在分析中排除缺失值
针对大部分函数,可以用na.rm=TRUE参数选项,结果忽略缺失值。
sum(leadership$q5, na.rm=TRUE)
[1] 13
4.5.4 函数na.omit()可以移除所有含有缺失值的观测(行)。(慎用)
na.omit(leadership) manager date country gender age q1 q2 q3 q4 q5 agecat 1 1 10/24/08 US M 32 5 4 5 5 5 Young 2 2 10/28/08 US F 45 3 5 2 5 5 Young 3 3 10/1/08 UK F 25 3 5 5 5 2 Young
4.6 日期值
函数as.Date()用于执行这种转化,而符号示例如下: %d 数字表示的日期(0~31)01~31 %a 缩写的星期名Mon %A 非缩写星期名Monday %m 月份(00~12)00~12 %b 缩写的月份Jan %B 非缩写月份January %y 两位数的年份07 %Y 四位数的年份2007 leadership$date <- as.Date(leadership$date, "%m/%d/%y")
4.6.1 使用format来输出指定格式的日期值,并且提取日期值中的某些部分:
format(Sys.Date(),"%B %d %Y") [1] "二月 14 2017" format(Sys.Date(),"%A") [1] "星期二" 4.6.2 数值上进行日期计算: as.Date("2017-01-01")-as.Date("2016-01-01") Time difference of 366 days 函数difftime()计算间隔和格式化输出: difftime(as.Date("2017-01-01"),as.Date("2016-01-01"),units="weeks") Time difference of 52.28571 weeks
4.6.3 将日期转换为字符型变量
as.character()可将日期值转换为字符型
4.7 类型转换
判断: is.numeric(); is.character(); is.vector(); is.matrix(); is.data.frame(); is.factor(); is.logical() 转换: as.numeric(); as.character(); as.vector(); as.matrix(); as.data.frame(); as.factor(); as.logical()
4.8 数据排序
使用order()函数对一个数据框进行排序,默认为升序,如果需要降续使用“-”即可。
按照gender正序,其中年龄倒序
leadership[order(gender, -age),] manager date country gender age q1 q2 q3 q4 q5 5 5 2009-05-01 UK F 99 2 2 1 2 1 2 2 2008-10-28 US F 45 3 5 2 5 5 3 3 2008-10-01 UK F 25 3 5 5 5 2 4 4 2008-10-12 UK M 39 3 3 4 NA NA 1 1 2008-10-24 US M 32 5 4 5 5 5
4.9 数据集的合并
使用merge()函数对两个数据框进行联结(内联结),例:
total <- merge(dataframeA, dataframeB, by=c("ID","Country"))
如果是简单的使两个行数相等的对象横向联结,可是使用cbind()进行:
total <- cbind(A,B)
如果两个数据框拥有相同的变量,则可以在行上进行合并,使用rbind():
total <- rbind(dataframeA,dataframeB)
4.10 数据集取子集
4.10.1 选入(保留)变量
数据框中的元素是通过dataframe[row indices,column indices]这样的记号来访问的,可以通过这种方法轻松的选取变量。如:
leadership[,c(6:10)] #效果等价 leadership[c("q1","q2","q3","q4","q5")] 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
4.10.2 剔除(丢弃)变量
myvars <- names(leadership) %in% c("q3", "q4") newdata <- leadership[!myvars] newdata manager date country gender age q1 q2 q5 1 1 2008-10-24 US M 32 5 4 5 2 2 2008-10-28 US F 45 3 5 5 3 3 2008-10-01 UK F 25 3 5 2 4 4 2008-10-12 UK M 39 3 3 NA 5 5 2009-05-01 UK F 99 2 2 1
#names(leadership)是包含所有变量名的字符型向量;通过%in% c("q3", "q4"),生成了变量名为"q3"和"q4"的变量为TRUE,其他的为FALSE。通过第二个命令,选择了变量名不为TRUE的数据框范围。
以下两种方式同样可以:
leadership[c(-8,-9)] #用“-”表示删掉 leadership$q3 <- leadership$q4 <- NULL #将需要删掉的列定义为NULL(与NA不同)
4.10.3 选入观测
通过逻辑判断的方式,选择需要的内容是数据分析的重要准备工作。
newdata <- leadership[1:3,] newdata <- leadership[leadership$gender=="M" & leadership$age >= 30,] newdata manager date country gender age q1 q2 q3 q4 q5 1 1 2008-10-24 US M 32 5 4 5 5 5 4 4 2008-10-12 UK M 39 3 3 4 NA NA
日期同样可用
leadership[which(leadership$date >= as.Date("2009-01-01","%Y-%m-%d") & leadership$date <= as.Date("2009-10-31","%Y-%m-%d")),]
4.10.4 subset()函数
subset()函数是选取变量非常快捷的方式。选择方式非常容易理解,而且写法简便。 newdata <- subset(leadership, age >= 35 | age < 24,select=c(q1, q2, q3, q4)) newdata <- subset(leadership, gender=="M" & age > 25,select=gender:q4)
4.10.5 随机抽样
sample()函数能够让你从数据集中(有放回和无放回的)抽取大小为n的一个随机样本:
示例:从1到数据框中观测的数量(总数),抽取的数目和参数:是否放回抽样(仅从总体中取样or越取样本越少)
mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE),]
4.11 使用SQL语句操作数据框
使用sqldf包,可以直接使用sqldf()嵌入SQL语句来实现表格的选择。
library(sqldf) newdf <- sqldf("select * from mtcars where carb=1 order by mpg",row.names=TRUE) newdf
OK,使用基本的函数解决数据管理就先写这么多,后面再陆续更新一些R包解决较复杂的数据处理管理。