R语言实战

    xiaoxiao2023-11-08  149

    第4章 基本数据管理

    1. 一个示例

    1. 职业经理人
    创建leadership数据框 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)

    2. 创建新变量

    1. 构造公式
    变量名 <- 表达式算术运算符 运算符描述+加-减*乘/除^ 或 **求幂x%%y求余x%/%y整数除法
    2. 创建新变量
    将新变量整合到原始数据框中(3种方法) 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)

    3. 变量的重编码

    逻辑运算符 运算符描述<小于<=小于或等于>大于>=大于或等于==严格等于!=不等于!x非xx|yx或yx&yx和yisTRUE(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()

    4. 变量重命名

    调用交互式编辑器

    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", ...))

    5. 缺失值

    缺失值

    NA Not Available 不可用

    检测缺失值

    is.na()

    不可能的值

    NaN not a number 不是一个数

    检测不可能的值

    is.infinite() is.nan()

    1. 重编码某些值为缺失值

    leadership示例

    leadership$age[leadership$age == 99] <- NA
    2. 在分析中排除缺失值

    含有缺失值的算数表达式和函数的计算结果也会是缺失值

    使用 na.rm=TRUE 移除缺失值再运算

    y <- sum(x, na.rm=TRUE)

    使用 na.omit() 移除所有含缺失数据的行

    newdata <- na.omit(leadership)

    6. 日期值

    日期格式 符号含义示例%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")
    1. 将日期转换为字符型变量

    使用 as.character() 将日期值转化为字符型

    strDates <- as.character(dates)
    2. 更进一步
    时间格式 strftime对日期进行复杂计算 timeDate 包

    7. 类型转换

    向一个数值型向量中添加一个字符串会将此向量中的所有元素转换为字符型类型转换函数 判断转换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()

    8. 数据排序

    使用 order() 对一数据框进行排序,默认升序

    newdata <- leadership[order(leadership$age), ]

    排序变量前加减号,降序排序

    9. 数据集的合并

    1. 向数据框添加列

    使用 merge() 横向合并两个数据框

    total <- merge(dataframeA, dataframeB, by="ID")

    使用 cbind() 直接横向合并两个矩阵或数据框

    total <- cbind(A, B)
    2. 向数据框添加行

    使用 rbind() 纵向合并两个数据框

    total <- rbind(dataframeA, dataframeB)

    两数据框必须拥有相同的变量

    使变量一直,预处理:

    删除多余变量

    创建缺失值变量

    10. 数据集取子集

    1. 选入变量

    创建新数据集保留需要变量

    newdata <- leadership[ ,c(6:10)]

    将行下标留空,表示选择所有行

    通过变量名选择数据

    myvars <- c("q1", "q2", "q3", "q4", "q5") newdata <- leadership[myvars]

    等同

    myvars <- paste("q", 1:5, sep="") newdata <- leadership[myvars]
    2. 剔除变量

    通过变量下标剔除变量,在列下标前加一减号,剔除该列

    newdata <- leadership[c(-8, -9)]

    通过变量名剔除变量

    myvars <- names(leadership) %in% c("q3", "q4") newdate <- leadership[!myvars]

    将不需要列赋值为NULL

    leadership$q3 <- leadership$q4 <- NULL
    3. 选入观测

    通过下标选入观测

    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), ]
    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)
    5. 随机抽样

    使用 sample() 从数据集中抽取随机样本

    mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE), ]

    第1个参数是由要从中抽取的元素组成的向量

    第2个参数是抽取的元素数量

    第3个参数表示无放回抽样

    齐全的抽样工具 sampling 包

    分析复杂调查数据 survey 包

    11. 使用SQL语句操作数据框

    使用 sqldf 包

    项目主页 http://code.google.com/p/sqldf/

    最新回复(0)