创建新变量
在平时的项目之中,对于已有的数据,可能需要对现有的变量进行转换或常见新变量。
下面介绍3中创建新变量的方法:
有数据框
mydata <- data.frame(x1=c(1,4,5,3),x2=c(5,6,2,4))
需要增加两个新的变量sumx(x1和x2之和),meanx(x1和x2的平均值)。
方法一
mydata$sumx <- mydata$x1+mydata$x2
mydata$meanx <- (mydata$x1+mydata$x2)/2
方法二
> attach(mydata)
> mydata$sumx <- x1+x2
> mydata$smeanx <- (x1+x2)/2
> detach(mydata)
方法三
mydata <- transform(mydata,sumxx=x1+x2,meanx=(x1+x2)/2)
推荐使用方法三,简洁明了
三种方法的最终结果都一样:
变量的重编码
在数据的处理的时候,有时需要对变量的现有值进创建新值,例如:
>将连续变量转换成分段的值
>将误编码的值替换为正确的值
>将一组年龄分为年轻,中年,年长
......
语句variable[condition] <- expression condition为真的时候才执行赋值。
eg:
leadership$agecat[leadership$age > 75] <- "Elder" #该语句将数据框中的age变量大于75的编码为Elder,新的变量名称叫agecat
变量的重命名
三种方法
1. fix()函数,fix(dataframe)
2.rename()函数,需要先安装reshape包
使用:rename(dataframe,c(oldname="newname",...))
3. names()函数
namespace(dataframe)[n] <- "newname" #n为需修改名称的变量所在列位置
缺失值
R语言中NA表示缺失值,NaN表示非数值(例如被0除的数)
is.na()函数用来检测是否存在缺失值
重编码缺失值
格式:variable[condition] <- expression condition为真时,执行赋值
在分析中排除缺失值
使用参数na.rm=TRU
eg:x <- c(1,2,NA)
y<-sum(x) #则y为NA
z <- sum(x,na.rm=TRUE) 则z值为3
函数na.omit()可以删除所有含有缺失值的行。
不同函数处理不完整数据可能有不同的方法,具体查看每个函数
日期值
as.Date()函数
as.Date(x,"input_format") # input_format表示日期的输入格式
符号 | 含义 | 示例 |
%d | 数字日期 | 01~31 |
%a | 缩写星期名 | 周一 |
%A | 非缩写星期名 | 星期一 |
%m | 月份 | 00~12 |
%b | 缩写的月份 | 11月 |
%B | 非缩写的月份 | 十一月 |
%y | 两位数的年份 | 15 |
%Y | 四位数的年份 | 2015 |
函数Sys.date()返回当天的时间,只有年月日
函数date()返回当天的时间,年月日时分秒星期
时间间隔的计算:(1)两个日期直接相减(2)使用函数difftime() 。格式为difftime(date1,date2,units="years/weeks/days...")
常用类型转换函数
判断 | 转换 |
is.numeric() | as.numeric() |
is.character() | as.character() |
is.vector() | as.vector() |
ix.matrix() | as.matrix() |
is.data.frame() | as.data.frame() |
is.factor() | as.factor() |
is.logical() | as.logical() |
数据的排序
使用order()函数进行数据排序,默认为升序,在变量名前加减号表示降序。
eg:数据框leadership按age的降序排列。newdata <- leadership[order(leadership$age)]
数据集的合并
(1)增加列,使用merge()函数,一般两个数据框有至少一个相同的列,通过这些列进行合并
eg: total <- merge(dataframeA,dataframeB,by="ID") # 按照单列合并
或total <- merge(dataframeA,dataframeB,by=c("ID","country")) #按照多列合并
cbind()函数
若两个数据框没有共同的列,合并两个数据框使用cbind()函数,但两个对象必须有相同的行数。
(2)添加行(追加)。
rbind()函数
eg: total <- rbind(dataframeA,dataframeB)
要力求两个数据框必须有相同的变量。若数据框A中有B中没有的变量,则
a. 删除数据框A中多于的变量
b. 在数据框B中追加变量并将其设为NA
选取数据子集
(leadership为举例数据框)
(1) 选择部分变量(列)
法1:newdata <- leadership[,c(6:10)]或者newdata <- leadership[,6:10]
法2:myvars <- c("q1","q2","q3","q4") # q1,2,3,4表示要提取的变量名
newdata <- leadership[myvars]
(2)删除部分变量(列)
myvars <- names(leadership)%in%c("q1","q2","q3","q4") # q1,2,3,4表示要提取的变量名
newdata <- leadership[!myvars]
(3)选择或删除行newdata <- leadership[1:3,] # 选取1到3行
newdata <- leadersgip[which(leadership$gender =="M" & leadership$age >30),] #按条件选取行,“,”不能忘。
利用subset()函数选取子集
newdata <- subset(leadership,age>35|age<24,select=c(q1,q2,q3,q4))
数据的随机抽样
sample()函数
sample(x, size, replace = FALSE, prob = NULL)其中 x 为向量,要抽取的数据集的范围,size为整数,要抽取的个数,replace表示物防会抽样,prob表示为获取的数据分配的权值向量
使用sql操作数据框
需安装sqldf包
eg: a <- sqldf("select * from mtcars order by mpg",row.name=TRUE) # row.name=TRUE表示将原始数据框的变量名用到新的数据框中,sql语句的写法同往常的一样。