第四章 基本数据管理
0605 22:27 晴
Dataframe基本操作
manager <- c(1,2,3,4,5)
date <- c("10/24/08","10/28/08","10/1/08","10/12/08","5/1/09")
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,gender,age,q1,q2,q3,q4,q5,
stringsAsFactors=FALSE)
#stringsAsFactors=F 很重要,防止自动把字符转换成factor
leadership$agecat[leadership$age == 99]<-NA
leadership$agecat[leadership$age > 75]<-"Elder"
leadership$agecat[leadership$age >= 55 &
leadership$age <= 75]<- "Middle"
leadership$agecat[leadership$age <55]<- "Young"
以上操作可以被within( ) 替代
leadership<-within(leadership,{
agecat<-NA
agecat[age>75]<-"Elder"
agecat[age>=55 & age<=75]<-"Middle Aged"
agecat[age<55]<-"Young"})
> names(leadership) # 变量名,当然也可以重新编码
[1] "manager" "date" "gender" "age" "q1" "q2" "q3" "q4" "q5" "agecat"
改变变量名
names( )
> names(leadership)
[1] "manager" "date" "gender" "age" "q1" "q2" "q3" "q4" "q5"
> names(leadership)[2] <- "testDate"
> leadership
manager testDate gender age q1 q2 q3 q4 q5
1 1 10/24/08 M 32 5 4 5 5 5
2 2 10/28/08 F 45 3 5 2 5 5
3 3 10/1/08 F 25 3 5 5 5 2
4 4 10/12/08 M 39 3 3 4 NA NA
5 5 5/1/09 F 99 2 2 1 2 1
>
缺省值基本操作
- is.na( ) 检查是否存在缺失值
> is.na(leadership[, 5:9])
q1 q2 q3 q4 q5
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE TRUE TRUE
[5,] FALSE FALSE FALSE FALSE FALSE
- 指定缺省值NA
leadership[age == 99, "age"] <- NA
# or leadership$age[leadership$age == 99]<-NA
- 排除缺省值
> x <- c(1, 2, NA, 3)
> y <- x[1] + x[2] + x[3] + x[4]
> z <- sum(x)
> y
[1] NA
> z
[1] NA
> x <- c(1, 2, NA, 3)
> y <- sum(x, na.rm=TRUE)
> y
[1] 6
- 使用 na.omit( ) 删除不完整的数据
> newdata <- na.omit(leadership)
> newdata
manager testDate gender age q1 q2 q3 q4 q5 agecat
1 1 10/24/08 M 32 5 4 5 5 5 Young
2 2 10/28/08 F 45 3 5 2 5 5 Young
3 3 10/1/08 F 25 3 5 5 5 2 Young
5 5 5/1/09 F 99 2 2 1 2 1 Elder
时间日期的基本操作
- 计算日期差
startdate <- as.Date("2004-02-13")
enddate <- as.Date("2009-06-22")
enddate - startdate
today <- Sys.Date()
dob <- as.Date("1956-10-12")
difftime(today, dob, units="weeks")
- 更加详细的时间操作包
lubridate, timeDate
数据排序
> newdata <- leadership[order(leadership$age),]
> newdata
manager testDate gender age q1 q2 q3 q4 q5 agecat
3 3 10/1/08 F 25 3 5 5 5 2 Young
1 1 10/24/08 M 32 5 4 5 5 5 Young
4 4 10/12/08 M 39 3 3 4 NA NA Young
2 2 10/28/08 F 45 3 5 2 5 5 Young
5 5 5/1/09 F 99 2 2 1 2 1 Elder
数据框合并
total <- merge(dataframeA, dataframeB, by="ID")
total <- cbind(A, B) #横向合并
total <- rbind(dataframeA, dataframeB)
#纵向合并,必须要有相同的变量,如果没有,就需要删除多余变量或者添加NA
数据集子集
myvars <- names(leadership) %in% c("q3", "q4")
newdata <- leadership[!myvars]
短短的两条代码,目的很简单,但逻辑上需要绕一下。
- 选择了leadership的变量名
- %in%提取其中的 "q3","q4"变量
综合1,2就是把变量名“q3","q4"编制成myvars - 把不含myvars也就是“q3","q4"变量的数据重新整合成一个新的数据newdata
举一反三: 删除列是这样的,删除行怎么办呢
把names( ) 换成 rownames( ) 就OK了
其他办法
leadership$q3 <- leadership$q4 <- NULL
leadership$date <- as.Date(leadership$date, "%m/%d/%y")
startdate <- as.Date("2009-01-01")
enddate <- as.Date("2009-10-31")
newdata <- leadership[which(leadership$date >= startdate &
leadership$date <= enddate),]
- subset( ) 函数
需要经常使用这个函数,还是比较便利的
newdata <- subset(leadership, age >= 35 | age < 24,
select=c(q1, q2, q3, q4))
newdata <- subset(leadership, gender=="M" & age > 25,
select=gender:q4))
- 随机抽样
随机抽三行
mysample <- leadership[sample(1:nrow(leadership), 3, replace=FALSE),]
以上
0606 16:49
网友评论