R--基本数据管理

创建新变量,在数据框中创建新的变量

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)```

#创建leadership的数据框

manager<-seq(1,5,1)
date<-c("10/24/08","10/28/08","10/01/08","10/12/08","05/01/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)```

变量的重编码,将age重编码为类别型变量

#先将99岁重编码为缺失值NA
leadership$age[leadership$age==99]<-NA
#within函数和with相似都是营造出一个可以随便使用数据框的环境,只是within可以修改数据框的值
leadership<-within(leadership,{
  agecat<-NA
  agecat[age>75]           <-"Elder"
  agecat[age>=55 & age<=75]<-"middle age"
  agecat[age<=55]          <-"young"
})```

#变量的重命名,三种方法

第一种,使用fix()函数手动去修改

fix(leadership)

第二种reshape包的rename()函数

library(reshape)

第二个参数使用向量表示要替换的列名

leadership<-rename(leadership,c(manager="managerID",date="testdate"))

第三种names()函数

显示该数据框的所有名称变量

names(leadership)

然后修改

names(leadership)[2]<-"date"
names(leadership)[6:10]<-c("item1","item2","item3","item4","item5")```

缺失值

y<-c(1,2,3,NA)
#检测函数,返回4个相同大小的对象,值为TRUE或者FALSE
is.na(y)
#重新编码某些值为缺失值
leadership$age[leadership$age == 99] <- NA
#在分析中排除缺失值
#数值函数中有na.rm=TRUE这一选项就可以去除缺失值使用剩下的值进行计算
x <- c(1,2,3,NA)
y <- sum(x,na.rm = TRUE)
#或者使用na.omit()函数移除有含有缺失值得那一行
leadership
newdata <- na.omit(leadership)
newdata```

#日期值

将不同的日期值进行转换,as.Date(x,format=""),默认是yyyy-mm-dd

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

使用另一种格式

strdates <- c("01/05/1965","08/16/1975")
dates <- as.Date(strdates,"%m/%d/%Y")

转化leadership,%y表示两位数的year,转化成标准的格式

myformat <- "%m/%d/%y"
leadership$date <- as.Date(leadership$date,myformat)

Sys.Date()返回当天的日期,date()返回当前的日期与时间

today <- Sys.Date()
nowtime <- date()

format()函数进行输出格式化,%B表示非缩写月份,%d表示数字表示的日期,%A表示非缩写星期名

format(today,format="%B %d %Y")
format(today,format="%A")

计算我已经度过了多少天

startdate <- as.Date("1994-06-22")
nowdate <- Sys.Date()
days <- nowdate - startdate
days

difftime()函数计算时间间隔,来格式化输出

difftime(nowdate,startdate,units = "weeks")

出生的时候是星期几

format(startdate,format="%A")

将日期转化为字符型变量

strDates <- as.character(dates)```

类型转换

#is.numeric(),is.character(),is.vector(),is.matrix(),is.factor(),is.data.frame(),is.logical()

#as.numeric(),as.character(),as.vector(),as.matrix(),as.factor(),as.data.frame(),as.logical()
#在使用if-then的控制流的时候,is.datatype()将很有用,然后as.datatype()进行类型转化```

#排序

在要排序的field前面加上-号就是以降序的方式排序

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

以age为优先排序,然后再以gender进行排序

order()函数返回排序后的索引值,因此leadership会根据这些行索引值重新排序后赋给newdata

newdata <- leadership[order(age,gender),]
newdata
detach(leadership)```

横向合并(添加列)

id <- c(1,2,3,4)
ch1 <- c(1,2,3,4)
ch2 <- c(5,6,7,8)
example1 <- data.frame(id,ch1,ch2)
id <- c(1,2,3,4)
ch3 <- c(12,34,56,78)
ch4 <- c(123,456,789,123)
example2 <- data.frame(id,ch3,ch4)
example1
example2
#直接合并,不需要公共索引的话,使用cbind()函数,为了正常工作,保证有相同行数,相同顺序排序
#total <- cbind(example1,example2)
total <- merge(example1,example2,by="id")```

#纵向合并(添加行)

id <- c(1,2,3,4)
ch1 <- c(1,2,3,4)
ch2 <- c(5,6,7,8)
example1 <- data.frame(id,ch1,ch2)
id <- c(1,2,3,4)
ch2 <- c(12,34,56,78)
ch1 <- c(123,456,789,123)
example2 <- data.frame(id,ch2,ch1)
total <- rbind(example1,example2)

要保证有相同的变量(列数),顺序可以不同```

选入变量

#数据框选择元素dataframe[row_indices,column_indices]
newdata <- leadership[,c(6:10)]
#选择6到10列的所有行
myvars <- c("q1","q2","q3","q4","q5")
newdata <- leadership[myvars]
#直接通过列名来选择列
myvars <- paste("q",1:5,sep = "")
newdata <- leadership[myvars]
#paste函数将前面两个向量中的值分别连接起来,返回1个字符型向量```

#丢弃变量

第一种方法

leadership中是q3,q4的将为真,返回一个逻辑向量

myvars <- names(leadership) %in% c("q3","q4")

将myvars这个逻辑向量取反,这样q3,q4为false,就会从leadership中丢弃

newdata <- leadership[!myvars]

第二种方法

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

在某列的下标之前加一个减号,就会剔除这一列

第三种方法

leadership$q3 <- leadership$q4 <- NULL

将这两列设为NULL未定义```

选入行


#选择1-3行的所有列
newdata <- leadership[1:3,]
#which将给出向量值中为TRUE的下标
newdata <- leadership[which(leadership$gender == "M" & leadership$age > 30),]

attach(leadership)
newdata <- leadership[which(gender == "M" & age > 30),]
detach(leadership)

#查询时间
#先将数据框的时间转化为标准值,format模式匹配,加上双引号
leadership$date <- as.Date(leadership$date,"%m/%d/%y")
startdate <- as.Date("2009-01-01")
stopdate <- as.Date("2010-01-01")
newdata <- leadership[which(leadership$date >= startdate & leadership$date <= stopdate),]```

#subset()函数

第一个参数是数据框,第二个参数是列变量的逻辑,第三个参数是选择的列

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

并且select后面跟的参数,列名,不需要加引号

newdata <- subset(leadership,gender == "M" & age > 25,select = gender:q4)```

随机抽样sample()函数

#第一个参数是总的选取集合,这里是所有行,第二个参数是要抽样的数,第三个参数表示不放回的抽样
mysample <- leadership[sample(1:nrow(leadership),3,replace = FALSE),]```

你可能感兴趣的:(R--基本数据管理)