4.1 创建新变量
在你需要的分析数据中,往往要用新的变量或者对现有的变量进行变换:变量名 <- 表达式
。
而在表达式中,往往包含很多种的运算符和函数:
数据框中创建添加心变量的三种方式,其实第一种和第二种是完全一样的,第三种使用
transform()
函数来创建新的变量。
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)
4.2 变量的重编码
重编码数据,可以使用R中一个或多个逻辑值运算符。能够返回逻辑值
需要将其中的年龄变量重新编码,99岁的年龄值重编码为缺失值:
leadership$age[leadership$age == 99] <- NA
接着使用以下代码创建重编码之后的新变量:
# within()和with()函数类似,不同在于within()函数可以修改数据框。
变量[原始变量逻辑运算] <- 表达式
leadership <- within(leadership,{
agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <= 75] <- "Middle Aged"
agecat[age < 55] <- "Young" })
4.3 变量的重命名
- 如果对现有的变量名不满意,那么就可以交互或者编程的方式进行修。
fix(数据框)
来调用一个交互式的编辑器,图形化界面,修改就可以。 -
names()
函数来重命名变量。如names(leadership)[2] <- "testDate"
可以将date重新命名为testDate。 - 此外还有plyr包中的一个
rename()
函数,可用于修改变量名。
4.4 缺失值(NA)
- R提供了一些函数,用于识别包含缺失值的观测。比如
is.na()
函数可以检测是否存在缺失值,如果存在,则将被在相应位置返回TRUE值。 - 在数据分析之前,以某种方式删除缺失值。含有缺失值的算术表达式和函数的计算结果都是缺失值。大多数函数拥有一个
na.rm=TRUE
选项,可以在计算之前移除缺失值并使用剩余的值计算 - 还可以通过
na.omit()
函数删除所有含有缺失数据的行。行删除,是处理不完整数据集的若干手段之一。
4.5 日期值
日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量。函数as.Data()
用于执行这种转化。语法:as.Data(x, "input_format")
,其中x是字符型数据,input_format则给出了用于读入日期的适当格式。
使用指定格式读取字符型变量,并将其作为一个日期变量替换到数据框中。这种转换一旦完成,就可以使用诸多方法对这些日期进行分析和绘图。
Sys.Date()
和date()
分别是可以返回当天的日期和当前日期和时间的函数。
函数format(x, format="output_format")
可以输出指定格式的日期值,并且可以提取日期中的某些部分。
today <- Sys.Date()
format(today, format="%B %d %Y")
format(today, format="%A")
R的内部在存储日期时,是使用自1970年1月1日以来的天数表示的,更早的日期为负数。所以可以在日期值上执行算术运算。
startdate <- as.Date("2004-02-13")
enddate <- as.Date("2009-06-22")
days <- enddate - startdate
用difftime()
来计算时间间隔,并以星期、天、时、分、秒来表示
today <- Sys.Date()
dob <- as.Date("1956-10-12")
# units参数来指定表示方式,这里是weeks
difftime(today, dob, units="weeks")
当然,也可以将日期转换为字符型变量。函数as.character()
可将日期值转换为字符型。一旦转换完成,可以用一系列字符处理函数处理数据。此外,lubridate包和timeDate包也提供了大量的日期处理函数,可以对日期进行运算。
4.6 类型转换
R中提供了一系列判断某个对象的数据类型和将其转换为另一种数据类型的函数。is.datatype()
这些函数结合控制流使用时,将成为一类强大的工具,即允许根据数据的具体类型以不同的方式处理数据。
4.7 数据排序
order()
函数可以对一个数据框进行排序,默认的排序顺序是升序。在排序变量的前边加一个减号,即可以得到降序的结果。一般是由女性到男性。
4.8 数据集的合并
- 要横向合并两个数据框,要使用
merge()
函数。大多数情况下,两个数据框是通过一个或者多个变量联结的。total <- merge(dataframeA, dataframeB, by = "ID")
就是通过ID将两个数据框合并。类似的横向联结通常用于向数据框中添加变量,此外cbind()
进行直接横向合并,每个对象要有相同的行数以同样顺序排列。 -
rbind()
可以纵向合并两个数据框,但两个数据框必须拥有相同的变量,顺序不必相同。
4.9 数据集取子集
- 保留变量:我们经常会从大数据集中选取小数据集,可以通过下标的方式来选择变量。下标留空,表示选择所有的行或者列。
- 剔除变量:
# 首先生成所有变量名的字符型向量,返回一个逻辑向量,匹配q3和q4的为TRUE值,最后用!将逻辑值反转,最后选择逻辑值为TRUE的列,q3和q4被剔除。
myvars <- names(leadership) %in% c("q3", "q4")
leadership[!myvars]
# 其他的方法也可以剔除,在某一列的下标之前加一个减号。会剔除那一列
newdata <- leadership[c(-8,-9)]
# 将q3和q4设定为未定义,也可以完成变量删除工作
leadership$q3 <- leadership$q4 <- NULL
-
subset()
函数是选择变量和观测最简单的方法:
# 选择了q1到q4中,年龄大于等于或者小于24的观测值
newdata <- subset(leadership, age >= 35 | age < 24,
select=c(q1, q2, q3, q4))
# 选择了gender到q4变量中,年龄大于25的男性的观测值
newdata <- subset(leadership, gender=="M" & age > 25,
select=gender:q4)
第四章终于完成学习,算是对我之前学习的一个复习,接下来第五章就是全新的开始了,或许会更艰难,快要涉及到统计学。