文档库 最新最全的文档下载
当前位置:文档库 › 基本数据管理

基本数据管理

# 基本数据管理

# 建立数据框

manager<-c(1,2,3,4,5)
date<-c("10/24/08","10/28/8","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)

# 创建新变量

sumq<-leadership$q1+leadership$q2+leadership$q3+leadership$q4+leadership$q5
leadership$sumq<-sumq

# 注意在R中的数学运算,只有参与运算的对象中有一个是NA,那么结果为NA

# 创建新变量时也是可以用

leadership<-transform(leadership,
sumq=q1+q2+q3+q4+q5)

#变量的重编码

#将连续型变量转换成类别值

leadership$agecat[leadership$age>75]<-"Elder"
leadership$agecat[leadership$age>=55 & leadership$age<=75]<-"Middle Aged"
leadership$agecat[leadership$<55]<-"Young"

# 这段代码还可以用

leadership<-within(leadership,
agecat<-NA
agecat[age>75]<-"Elder"
agecat[age>=55 & age<=75]<-"Millde Aged"
agecat[age<55]<-"Young")

# 变量的重命名

#最简单粗暴的方法
fix(leadership)

rename(leadership,c(oldname1="newname1",oldname2="newname2",....))

# reshape包里面的函数

names(leadership)[1,3]<-c("newname1","newname3")



#处理缺失值的方法

is.na(leadership["q4"])

# 重新编码某些缺失值

leadership$age[leadership$age==99]<-NA

# 在分析中排除缺失值,很多数值计算函数都含有 na.rm=TRUE这个参数,可以在算之前移除缺失值


# 移除不完整的观测
newleadership<-na.omit(leadership)

leadership<-newleadership

# 日期值

# 日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量。

as.Date() # 可以实现这种转化

mydates<- as.Date(c("2007-06-22","2004-02-13"))
#还可以自定义格式
myformat<-"%Y-%m-%d"
mydates<- as.Date(c("2007-06-22","2004-02-13"),myformat)


# 查看系统日期

Sys.Date()

#查看系统日期+时间

date()

# 可以使用

mydate<-as.Date("2007-04-23")
format(x,format="%A %B")


# 也可以用

difftime() #来计算时间间隔

today<-Sys.Date()
dob<-as.Date("1956-10-22")
difftime(today,dob,units="weeks")

# 计算我生于周几
birthday<-as.Date("1992-09-11")
format(birthday,format="%A")

# 把日期转换为字符型变量

strDates<-as.character(birthday)

# 类型转换

# 判断类型的函数

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()函数可以对数据框进行排序

newd

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

# order()函数返回的是观测编号的升序排列向量

# 在变量字段前面加一个减号便是降序排列

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

# 联合排序
attach(leadership)
newdata<-leadership[order(gender,-age ),] #先按照gender升序,再按照age降序

#数据集的合并

# 添加列(横向联接)

habit<-c("computer","computer","computer","computer","computer",
"swimming","swimming","swimming")

habit<-data.frame(leadership$manager,habit,stringsAsFactors=FALSE)
names(habit)[1]<-"manager"
total<-merge(leadership,habit, by="manager")


# 如果要简单粗暴的直接横向合并两个矩阵或数据框,并且不需要制定一个公共索引,
# 可以直接用函数 cbind(),但是注意,cbind()函数要求两个对象必须要有一样的行数
# 并且要以相同的顺序排序

habit<-habit[order(-habit$manager),]
total_dir<-cbind(leadership,habit)
total_dir


# 简便方法
subset()
newdata<-subset(leadership, age>=35 | age<24,
select=c(q1,q2,q3,q4))

newdata<-subset(leadership, gender=="M" | age<24, #中间的条件选择行
select=gender:q4) #select选择列
# 冒号运算符在这里表示gender到q4及中间的字段全部入选

#nrow() 返回的是数据集的观测数
nrow(leadership)
#ncol() 返回的是数据集的字段数
ncol(leadership)

# 随机抽样

sample(1:10,3,replace=FALSE)
#表示从1到10中不放回的随机抽取3个数

# 所以,在数据集中抽样就可以写为

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


-----------------以下是R程序----------------------
myarray<-array(c(1,2,3,4,5,6),
c(2,2,2),
dimnames=list(c("11","12"),c("21","22"),c("31","32"))
)

myarray

# 数据框
mydata<- data.frame(col1,col2,col3....)

weight<-c(54,44,45,67,43,22,45,56)
height<-c(1.54,1.44,1.45,1.34,1.76,1.88,1.22,1.54)

body<-data.frame(weight,height)
body
body$bmi<-body$weight/body$height^2
# 或者
body[3]<-body[1]/body[2]^2

names(body)<-c("体重","身高","BMI值")

body$type<-c(rep("type1",4),rep("type2",4))
body$class<-c(rep("class1",2),rep("class2",2),rep("class3",2),rep("class4",2))

attach(body)
table(type,class)
detach(body)

summary(body$bmi)


sumq<-leadership$q1+leadership$q2+leadership$q3+leadership$q4+leadership$q5
leadership$sumq<-sumq
head(leadership)
plot(body$height,body$weight)
with(body,
{
summary(height)
summary(weight)
})


#因子

diabetes<- c("type1","type2","type3","type1")
diabetes<-factor(diabetes)

str(diabetes)

diabetes<-factor(c("type1","type2","type3","type1"),order=TRUE,
levels=c("type2","type1"))

diabetes

# 列表

g<-"My First List"
h<-c(25,23,34,12)
j<-matrix(1:4,nrow=2)
k<-c("a","b","c")
mylist<-list(title=g

, ages=h, j, k)
str(mylist$ages)
mylist


#建立数据集

manager<-c(1,2,3,4,5)
date<-c("10/24/08","10/28/8","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)

head(leadership)

#另外一种方式
leadership<-transform(leadership,
sumq2=q1+q2+q3+q5)

# 日期值

mydates<- as.Date(c("2007-06-22","2004-02-13"))
mydates

x<-as.numeric(mydates[1]-mydates[2])
x

y<-mydates[1]-mydates[2]
class(y)
str(y)

date() # 查看系统日期时间

myformat<-"%Y-%m-%d"
mydates<- as.Date(c("2007-06-22","2004-02-13"),myformat)
mydates


mydate<-as.Date("2007-04-23")
format(mydate,format="%A %B")

# 计算时间间隔
today<-Sys.Date()
dob<-as.Date("1956-10-22")
difftime(today,dob,units="days")

# 计算我生于周几
birthday<-as.Date("1992-09-11")
format(birthday,format="%A")

habit<-c("computer","computer",
"swimming","swimming","swimming")

habit<-data.frame(leadership$manager,habit,stringsAsFactors=FALSE)
names(habit)[1]<-"manager"
total<-merge(leadership,habit, by="manager")
habit
total


habit<-habit[order(-habit$manager),]
total_dir<-cbind(leadership,habit)
total_dir<-total_dir[-manager]
total_dir<-total_dir[,-12]
total_dir


newobs<-total[2,]
newobs
newobs[1]<-6
newobs<-rbind(total,newobs)
newobs_nona<-na.omit(newobs)

#剔除变量
myvars<-names(leadership) %in% c("q3","q4")
newdata<-leadership[!myvars]

# 在数据集中随机抽样
mysample<-leadership[sample(1:nrow(leadership),3,replace=FALSE),]
mysample


#删除列
total_dir<-total_dir[,-(12:13)] # 删除第12,13列

#等价于
total_dir<-total_dir[-(12:13)] #不能写成-12:13, 这表示的是-12,-11,....,-1,0,1,...,13

#添加行

# 等价于纵向合并两个数据集

rbind()

newobs<-total[2,]
newobs
newobs[1]<-6
rbind(total,newobs)

# 数据集获取子集

# 选入(保留)变量

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

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

#myvars可以写成
myvars<-paste("q",1:5,sep="")
newdata<-leadership[myvars]

# 剔除(丢弃)变量

myvars<-names(leadership) %in% c("q3","q4") # 这里返回的是一个logical_vector。
newdata<-leadership[!myvars]

#也等价于

newdata<-leadership[-(8:9)]
#也等价于
leadership[9]<-leadership[8]<-NULL #注意,这里只能把NULL赋值给一列


# 选入观测(行)

newdata<-leadership[1:3,]
newdata<-leadership[which(leadership$gender=="M" &
leadership$age>30),]

# 注意,which()函数这里返回的是TRUE的向量下标

attach(leadership)
newdata<-leadership[which(gender=="M" & ag

e>30),]
detach(leadership)

#as.Date()函数同样也可以操作于向量

as.Date(leadership$date,format="%m/%d/%y")

# 当我们只希望选择一个时间段内的观测时,我们可以这样

leadership$date<-as.Date(leadership$date,format="%m/%d/%y")
startdate<-as.Date("2009-01-01")
enddate<-as.Date("2009-10-31")
newdata<-leadership[which(leadership$date>=startdate &
leadership$date<=enddate),]





相关文档
相关文档 最新文档