创建新变量
变量名 <- 表达式
表达式可以包含多种运算符和函数。
+ , - , * , / , ^ 或 * *(求幂),x%%y (求余),x%/%y (整数除法)
#第一种 mydata <- data.frame(x1= c(2, 2, 6, 4), x2= c(3, 4, 2, 8)) mydata$sumx <- mydata$x1 + mydata$x2 mydata$meanx <- (mydata$x1 + mydata$x2) / 2 #第二种 attach(mydata) mydata$sumx <- x1 + x2 mydata$meanx <- (x1 + x2) /2 detach(mydata) #第三种 mydata <- transform(mydata, sumx = x1 + x2, meanx = (x1 + x2) / 2)
transform()函数简化了按需创建新变量并将其保存到数据框中的过程。
变量的重编码
重编码涉及根据同一个变量和/或其他变量的现有值创建新值的过程。
语句variable[condition] <- expression 将仅在condition的值为TRUE时执行赋值
leadership <- within(leadership,{ agecat <- NA agecat[age >75] <- "Elder" agecat[age >=55 & age <= 75] <- "Middle Aged" agecat[age <55] <- "Young" })
函数within()与函数with()类似,不同的是它允许修改数据框。首先,创建了agecat变量,并将每一行都设为缺失值。括号中剩下的语句接下来依次执行。
变量的重命名
1,交互式地修改
fix()函数来调用一个交互式的编辑器。然后单击变量名,在弹出的对话框中将其重命名。
2,编程式地修改
names()函数来重命名变量。
#查看leadership数据框的所有变量名 names(leadership) #将leadership的第二个变量进行重命名 names(leadership)[2] <- "testDate" #重命名多个变量名 names(leadership)[6:10] <- c("item1", "item2", "item3", "item4", "item5")
plyr包中的rename()函数,使用格式为:
rename(dataframe, c(oldname="newname", oldname="newname", ...))
#安装plyr包 install.packages("plyr") library(plyr) leadership <- rename(leadership, c(manager="managerID", date="testDate"))
缺失值
在R中,缺失值以符号NA(Not Available,不可用)表示。R中字符型和数值型数据使用的缺失值符号是相同的。
函数is.na()用来检测缺失值是否存在。返回一个与检测对象相同大小的对象,如果某个元素是缺失值,相应的位置将被改写为TRUE,不是缺失值的位置则为FALSE.
y <- c(1, 2, 3, NA) #使用函数is.na() is.na(y) #返回 FALSE, FALSE, FALSE, TRUE
***注意:
1,缺失值被认为是不可比较的,即便是与缺失值自身的比较。不能使用比较运算符来检测缺失值是否存在。
例如:逻辑测试var == NA 的结果永远不会为TRUE.
2,R并不把无限的或者不可能出现的数值标记成缺失值。
正无穷和负无穷分别用Inf和-Inf标记。不可能的值(比如,sin(Inf))用NaN来标记(not a number,不是一个数)如果要识别这些数值,需要用到is.infinite()或
is.nan().
一,重编码某些值为缺失值
在分析之前确保所有的缺失数据都被妥善低编码为缺失值,否则分析结果将失去意义。
二,在分析中排除缺失值
在分析之前需要进一步以某种方式删除缺失值。因为含有缺失值的算术表达式和函数的计算结果也是缺失值。
x <- c(1, 2, NA, 3) y <- x[1] + x[2] + x[3] + x[4] z <- sum(x) #由于x中的第3个元素是缺失值,所以y和z也都是NA。 #使用na.rm=TRUE选项 y <- sum(x, na.rm=TRUE)
***na.rm=TRUE选项,可以在计算之前移除缺失值并使用剩余值进行计算。
函数na.omit()可以删除所有含有缺失数据的行。
日期值
日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量。as.Date()用于执行这种转化。格式为:as.Date(x, "input_format")
其中x是字符型数据,input_format则给出用于读入日期的适当格式。
%d 数字表示的日期(0-31) %a 缩写的星期名(Mon) %A 非缩写星期名(Monday)
%m 月份(00-12) %b 缩写的月份(Jan) %B 非缩写月份(January)
%y 两位数的年份(07) %Y 四位数的年份(2007)
strDates <- c("01/05/1965","08/16/1975")
dates <- as.Date(strDates,"%m/%d/%Y")
dates
[1] "1965-01-05" "1975-08-16"
#不知道为啥输出的日期格式都是yyyy-mm-dd,而不是%m/%d/%Y 这样形式的
Sys.Date() 返回当天的日期,date() 返回当前的日期和时间。
format(x, format="output_format") 输出指定格式的日期值,并且可以提取日期值中的某些部分。
format(today, format="%B %d %Y") [1] "十一月 02 2017" format(today, format="%A") [1] "星期四"
日期可以用来执行算术运算。
startdate <- as.Date("2004-02-13") enddate <- as.Date("2011-01-22") days <- enddate - startdate days Time difference of 2535 days
函数difftime() 计算时间间隔,并以星期,天,时,分,秒来表示。
today <- Sys.Date() dob <- as.Date("1956-10-12") difftime(today, dob, units="weeks") Time difference of 3185.857 weeks
将日期转换为字符型变量
as.character() 可将日期值转换为字符型。
类型转换
判断函数: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()
数据排序
order()函数对一个数据框进行排序,默认的排序顺序是升序。在排序变量的前边加一个减号即可得到降序的排序结果。
newdata <- leadership[order(gender, -age), ]
数据集的合并
1,向数据框添加列
多数情况下,两个数据框是通过一个或多个共有变量进行联结的。可以使用merge()函数
#将dataframeA和dataframeB按照ID进行了合并 total <- merge(dataframeA, dataframeB, by="ID")
直接横向合并两个矩阵或数据框,并且不需要指定一个公共索引,可以直接使用cbind()函数。
total <- cbind(A, B)
要保证每个对象必须拥有相同的行数,以同顺序排序。
2,向数据框添加行
纵向合并两个数据框,使用rbind()函数。
total <- rbind(dataframeA, dataframeB)
两个数据框必须拥有相同的变量,不过它们的顺序不必一定相同。(这句话理解有点问题)
如果dataframeA中拥有dataframeB中没有的变量,需要在合并之前先做处理:
1,删除dataframeA中的多余变量。
2,在dataframeB中创建追加的变量并将其值设为NA(缺失)。
数据集取子集
1,选入(保留)变量
#1,通过dataframe[row indices, column indices]访问 newdata <- leadership[, c(6:10)] #2,变量名 myvars <- c("q1", "q2", "q3", "q4", "q5") newdata <- leadership[myvars] #paste()函数 myvars <- paste("q", 1:5, sep=" ") newdata <- leadership[myvars]
2,剔除(丢弃)变量
#剔除 q3, q4两列 #names(leadership) %in% c("q3", "q4") 返回一个逻辑型向量,匹配q3或q4的元素值为TRUE myvars <- names(leadership) %in% c("q3", "q4") newdata <- leadership[!myvars] #在某一列的下标之前加一个减号(-)就会剔除那一列 newdata <- leadership[c(-8, -9)] #设为NULL(未定义),NULL与NA是不同的 leadership$q3 <- leadership$q4 <- NULL
3,选入观测
#通过设置下标来选入 newdata <- leadership[1:3, ] #通过相应的条件来选入 newdata <- leadership[leadership$gender=="M" & leadership$age>30, ]
4,subset()函数
newdata <- subset(leadership, age >=35 | age <24, select=c(q1, q2, q3, q4,)) #冒号运算符 from:to newdata <- subset(leadership, gender=="M" & age >25, select=gender:q4)
5,随机抽样
sample()函数能够让你从数据集中(有放回或无放回地)抽取大小为n的一个随机样本。
mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE) , ]
sample()函数中的第一个参数是一个由要从中抽样的元素组成的向量。第二个参数是要抽取的元素数量。第三个参数表示无放回抽样。
使用SQL 语句操作数据框
install.packages("sqldf") library(sqldf) #row.names=TRUE 将原始数据框中的行名延续到了新数据框中 newdf <- sqldf("select * from mtcars where carb=1 order by mpg", row.names=TRUE)
下载并安装好sqldf包,可以使用sqldf()函数在数据框上使用SQL中的SELECT语句。