目录
1、引例
2、创建新变量
3、变量的重编码
4、变量的重命名
5、缺失值
6、日期值
7、数据排序
8、数据集的合并
9、数据取子集
1、引例
现假设需要研究男性和女性在领导各自企业方式上的不同,为了很好地解答这个问题,我们可能需要各个方面的数据来进行对比分析,我们在这里提供的方法是让多个国家的经理的上司对他们的服务进行打分,使用的问题类似于:
1 | 2 | 3 | 4 | 5 |
非常不同意 | 不同意 | 既不同意也不反对 | 同意 | 非常同意 |
最后我们得到了这样的一个表格:
manager | date | 国籍 | gender | age | q1 | q2 | q3 | q4 | q5 |
---|---|---|---|---|---|---|---|---|---|
1 | 10/24/14 | US | M | 32 | 5 | 4 | 5 | 5 | 5 |
2 | 10/28/14 | US | F | 45 | 3 | 5 | 2 | 5 | 5 |
3 | 10/01/14 | UK | F | 25 | 3 | 5 | 5 | 5 | 2 |
4 | 10/12/14 | UK | M | 39 | 3 | 3 | 4 | ||
5 | 05/01/14 | UK | F | 99 | 2 | 2 | 1 | 2 | 1 |
我们可以用R语言对上面的表格建立数据框,使用代码
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,data,gender,age,q1,q2,q3,q4,q5)
为了解决一些我们所感兴趣的问题,首先,我们必须要解决一些关于R中数据管理方面上的一些问题
1、在问卷中,被调查者通常会跳过某些问题,就像上面第四个经理对q4和q5一样,这时我们得到了一个不完整的数据集,这当中有一些属于缺失值,同时年龄那一列数据当中的99也应该被重编为缺失值;
2、个数据集当中往往有成百上千个变量,而有时候我们所关心的可能就只有那几个数据,这时候,我们需要创建只包含我们感兴趣数据的数据集;
3、有时候我们需要将一些连续性的变量重编为一组类别值,比如将上表中的年龄指改成”青年”,“中年”,“老年”。
2、创建新变量
在某些实验中,我们可能需要对现有的数据添加向量或对现有的数据集做一些改动,这是我们可以通过以下语句来实现
变量名<-表达式
以上语句中的表达式可以包含多种运算符和函数
运算符 | 描述 |
---|---|
+ | 加5 |
- | 剪 |
* | 乘 |
/ | 除 |
^或** | 求幂2**2=4 |
x%%y | 求余(5%/%2=1) |
x%/%y | 整除(5%/%2=2) |
创建新变量的三种方法
#第一种方法
mydata<-data.frame(x1(1,2,3,4,5),x2(2,3,4,5,6))
mydata$sumx<-madata$x1+mydata$x2
mydata$meanx<-mydata$sumx/2
#这种方法是先创建一个数据框,然后再往数据框里添加数据
#第二种方法
attach(mydata)
mydata$sumx<-x1+x2
mydata$meanx<-(x1+x2)/2
#第三种方法
mydata<-tranform(mydata,sumx=x1+x2,
meanx=(x1+x2)/2)
#tranform函数还可以删除数据集当中的某一变量,只需将某一变量的值设为NULL即可
3、变量的重编码
有时候我们可能要根据某些变量的基本情况来对这些观测值进行分组,这时,变量的重编码就起到作用了
还以上面的表格数据为例,将年龄观测值分组成"Yong"、"Middle Aged"、"Elder"
我们可以这样做
variable[condition]<-expression
leadership$agecat[leadership$age>75]<-"Elder"
leadership$agecat[leadership$age<75&leadership$age>=55]<-"Middle age"
leadership$agecat[leadership$age<55]<-"Young"
这几行代码也可以精简成
leadership<-within(leadership,{
agecat<-NA
agecat[age>75]<-"Elder"
agecat[age<75&age>55]<-"Mlddle Age"
agent[age<55]<-"Young"})
4、变量的重命名
将变量重命名在R中有多中方法,在这里主要介绍两种方法
#(方法1)调用一个交互式的编辑器来修改变量名
fix(dataframe)
如下图所示
#(方法2)通过name()函数来重命名变量
names(leadership)[2]<-"textdate" #将leadership数据集中的第二个变量重命名为textdate
#names函数
#names(leadership)将返回leadership中所有的变量名
names(leadership)
[1] "manager" "age" "gender" "date" "q1" "q2" "q3" "q4"
[9] "q5" "agecat"
#names(leadership)表示leadership数据集中第二个变量
names(leadership)[5:9]<-c("item1","item2","item3","item4","item5")
manager age gender date item1 item2 item3 item4 item5 agecat
1 1 32 M 10/24/08 5 4 5 5 5 Young
2 2 45 F 10/28/08 3 5 2 5 5 Young
3 3 25 F 10/1/08 3 5 5 5 2 Young
4 4 39 M 10/12/08 3 3 4 NA NA Young
5 5 99 F 5/1/09 2 2 1 2 1 Elder
5、缺失值
在现实的调查当中,经常会出现被调查人跳过某些问题从而产生缺失值的情况,如上面表格中的item4和item5的第四行观测值,也有些很怪的数据不符合实际,也应该被认为是缺失值,如上表中年龄值出现的99;缺失值的符号表示为NA即Not Available,下面介绍R中处理缺失值的方法
#is.na()函数用来检测缺失值是否存在
is.na(leadership)
manager age gender date item1 item2 item3 item4 item5 agecat
[1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE
[5,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#将某些值重编码为缺失值
leadership$age[leadership$age==99]<-NA #将数据集leadership中变量age的99重编码为缺失值
ia.na(leadership$age)
[1] FALSE FALSE FALSE FALSE TRUE
#在具体的分析中排除缺失值的影响,只需在函数值中加入na.rm=TRUE选项
x<-c(1,2,3,NA)
sum(x)
[1] NA #由于x中有一个缺失值,所以作用在x上的sum函数输出值也为缺失值
x<-c(1,2,3,NA)
sum(x,na.rm=T) #对x进行排行缺失值处理
[1] 6
6、日期值
将字符型日期变量转换成数值型日期变量
#as.Date()函数用于这种变量类型之间的转换
#as.Date()基本格式:as.Date(x,"input_format")
mydate<-c("2018-12-27","2018-12-28")
as.Date(mydate)
#as.character 将数值型日期变量转换成字符型日期变量
#另外在R语言中支持多种类型转换
#is.datetype()这样的函数返回TRUE或者是FALSE
#as.datetype()这样的函数将变量转换成相应类型
7、数据排序
#order()函数用来对数据进行排序
newdate<-leadership[order(leadership$age),] #不要忘记加逗号','
manager age agecat gender q1 q2 q3 q4 q5
3 3 25 Young F 3 5 5 5 2
1 1 32 Young M 5 4 5 5 5
4 4 39 Young M 3 3 4 NA NA
2 2 45 Young F 3 5 2 5 5
5 5 99 <NA> F 2 2 1 2 1
newdata<-leadership[ordera(leadership$gender,leadership$age),] #先按性别排序,再在性别的基础上按年龄排序
manager age agecat gender q1 q2 q3 q4 q5
3 3 25 Young F 3 5 5 5 2
2 2 45 Young F 3 5 2 5 5
5 5 99 <NA> F 2 2 1 2 1
1 1 32 Young M 5 4 5 5 5
4 4 39 Young M 3 3 4 NA NA
8、数据集的合并
#向数据框添加列 merge()函数
newdataframe<-merge(dataframeA,dataframeB,by="Id")
9、数据取子集
#subset()函数
newdata<-subset(leadership,age>46|age<26,select=c(q1:q5))
q1 q2 q3 q4 q5
3 3 5 5 5 2
5 2 2 1 2 1
#with(),within(),transform()辨析对比
leadership<-within(leadership,{
agecat<-NA
agecat[age>75]<-"Elder"
agecat[age<75&age>55]<-"Midde Age"
agecat[age<55]<-"Young"})
leadership<-transform(leadership,agecat<-NA,
agecat[age>75] <-"Elder",
agecat[age<75&age>55]<-"Midde Age",
agecat[age<55] <-"Young")
#两种方法输出结果相同