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)
变量名 <- 表达式
运算符 | 描述 |
---|---|
+ |
加 |
- |
减 |
* |
乘 |
/ |
除 |
^ 或 ** |
求幂 |
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)
运算符 | 描述 |
---|---|
< |
小于 |
<= |
小于或等于 |
> |
大于 |
>= |
大于或等于 |
== |
严格等于 |
!= |
不等于 |
!x |
非x |
x|y |
x或y |
x&y |
x和y |
isTRUE(x) |
测试x是否为TRUE |
条件赋值
variable[condition] <- expression
leadership$age[leadership$age == 99] <- NA
创建新变量,根据 age
赋值
leadership$agecat[leadership$age > 75] <- "Elder"
leadership$agecat[leadership$age >= 55 &
leadership$age <= 75] <- "Middle Aged"
leadership$agecat[leadership$age < 55] <- "Young"
leadership <- within(leadership,{
agecat <- NA
agecat[age > 75] <- "Elder"
agecat[age >= 55 & age <= 75] <- "Middle Aged"
agecat[age < 55] <- "Young"
})
within()
与 with()
类似,within()
允许修改数据框
花括号内换行不需要逗号
重编码函数:cut()
,car
包中 recode()
,doBy
包中 recodevar()
调用交互式编辑器
fix(leadership)
通过 names()
重命名变量
names(leadership)[2] <- "testDate"
names(leadership)[6: 10] <- c("item1", "item2", "item3", "item4", "item5")
修改变量名函数:plyr
包中 rename()
rename(dataframe, c(oldname="newname", oldname="newname", ...))
缺失值
NA
Not Available 不可用
检测缺失值
is.na()
不可能的值
NaN
not a number 不是一个数
检测不可能的值
is.infinite()
is.nan()
leadership示例
leadership$age[leadership$age == 99] <- NA
含有缺失值的算数表达式和函数的计算结果也会是缺失值
使用 na.rm=TRUE
移除缺失值再运算
y <- sum(x, na.rm=TRUE)
使用 na.omit()
移除所有含缺失数据的行
newdata <- na.omit(leadership)
符号 | 含义 | 示例 |
---|---|---|
%d |
数字表示的日期(0~31) | 01~31 |
%a |
缩写的星期名 | Mon |
%A |
非缩写星期名 | Monday |
%m |
月份(0~12) | 00~12 |
%b |
缩写的月份 | Jan |
%B |
非缩写月份 | January |
%y |
两位数的年份 | 07 |
%Y |
四位数的年份 | 2007 |
as.Date()
将日期转化为数值形式mydates <- as.Date(c("2007-06-22", "2004-02-13"))
strDates <- c("01/05/1965", "08/16/1975")
datas <- as.Date(strDates, "%m/%d/%Y")
myformat <- "%m/%d/%y"
leadership$date <- as.Date(leadership$date, myformat)
SysDate()
返回当天日期date()
返回当前日期和时间format(x, format="output format")
输出指定格式日期today <- Sys.Date()
format(today, format="%B %d %Y")
format(today, format="%A")
difftime()
计算时间间隔today <- Sys.Date()
dob <- as.Date("1956-10-12")
difftime(today, dob, units="weeks")
使用 as.character()
将日期值转化为字符型
strDates <- as.character(dates)
strftime
timeDate
包判断 | 转换 |
---|---|
is.numeric() |
as.numeric() |
is.character() |
as.character() |
is.vector() |
as.vector() |
is.matrix() |
as.matrix() |
is.data.frame() |
as.data.frame() |
is.factor() |
as.factor() |
is.logical() |
as.logical() |
使用 order()
对一数据框进行排序,默认升序
newdata <- leadership[order(leadership$age), ]
排序变量前加减号,降序排序
使用 merge()
横向合并两个数据框
total <- merge(dataframeA, dataframeB, by="ID")
使用 cbind()
直接横向合并两个矩阵或数据框
total <- cbind(A, B)
使用 rbind()
纵向合并两个数据框
total <- rbind(dataframeA, dataframeB)
两数据框必须拥有相同的变量
使变量一直,预处理:
删除多余变量
创建缺失值变量
创建新数据集保留需要变量
newdata <- leadership[ ,c(6:10)]
将行下标留空,表示选择所有行
通过变量名选择数据
myvars <- c("q1", "q2", "q3", "q4", "q5")
newdata <- leadership[myvars]
等同
myvars <- paste("q", 1:5, sep="")
newdata <- leadership[myvars]
通过变量下标剔除变量,在列下标前加一减号,剔除该列
newdata <- leadership[c(-8, -9)]
通过变量名剔除变量
myvars <- names(leadership) %in% c("q3", "q4")
newdate <- leadership[!myvars]
将不需要列赋值为NULL
leadership$q3 <- leadership$q4 <- NULL
通过下标选入观测
newdata <-leadership[1:3, ]
通过筛选选入观测
newdata <- leadership[leadership$gender=="M" &
leadership$age >30, ]
可改写为
attach(leadership)
newdata <- leadership[gender=="M" & age >30, ]
detach(leadership)
限定时间在2009年1月1日和2009年12月31日之间
leadership$date <- as.Date(leadership$date, "%m/%d/%y")
startdate <- as.Date("2009-01-01")
enddate <- as.Date("2009-12-31")
newdata <- leadership[which(leadership$date >= startdate &
leadership$date <= enddate), ]
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)
使用 sample()
从数据集中抽取随机样本
mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE), ]
第1个参数是由要从中抽取的元素组成的向量
第2个参数是抽取的元素数量
第3个参数表示无放回抽样
齐全的抽样工具 sampling
包
分析复杂调查数据 survey
包
使用 sqldf
包
项目主页
http://code.google.com/p/sqldf/