《R语言实战》学习笔记第四章

基本数据管理

4.2 创建新变量

如果想创建一个储存当前数据库内数据运算后结果的变量到数据框中

使用within()函数(可以修改数据框中的变量)

> mydata <- data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8))
> mydata <- within(mydata,{
+ sumx <- x1+x2
+ meanx <- (x1+x2)/2
+ })
> mydata
  x1 x2 meanx sumx
1  2  3   2.5    5
2  2  4   3.0    6
3  6  2   4.0    8
4  4  8   6.0   12

还可以使用transform()函数。*注意:在向数据库中添加新变量时,使用transform()函数比其他函数使用起来更加简便。sumx和meanx后接的是等号而不是赋值符号,将新变量作为函数内的选项。

> rm(mydata)
> mydata <- data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8))
> mydata <- transform(mydata,sumx=x1+x2,meanx=(x1+x2)/2)
> str(mydata)
'data.frame':	4 obs. of  4 variables:
 $ x1   : num  2 2 6 4
 $ x2   : num  3 4 2 8
 $ sumx : num  5 6 8 12
 $ meanx: num  2.5 3 4 6

4.3 变量的重编码

常用的逻辑运算符见书P71

在希望对变量的现有值创建新值时,需要对变量值进行重编码并且将其储存为数据库的新变量值。

举例:

> manager <- c(1,2,3,4,5)
> date <- c("10/24/08","10/28/08","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)
> leadership
  manager     date country gender age q1 q2 q3 q4 q5
1       1 10/24/08      US      M  32  5  4  5  5  5
2       2 10/28/08      US      F  45  3  5  2  5  5
3       3  10/1/08      UK      F  25  3  5  5  5  2
4       4 10/12/08      UK      M  39  3  3  4 NA NA
5       5   5/1/09      UK      F  99  2  2  1  2  1

现在想对受调查者的年龄进行分层,分选为“Young”,“Middle aged”,“Elder”。

使用within()函数

> leadership <- within(leadership,{
+ agecat <- NA
+ agecat [age>75] <- "Elder"
+ agecat[age<=75 & age>=55] <- "Middle aged"
+ agecat[age<55] <- "Young"
+ })
> leadership
  manager     date country gender age q1 q2 q3 q4 q5 agecat
1       1 10/24/08      US      M  32  5  4  5  5  5  Young
2       2 10/28/08      US      F  45  3  5  2  5  5  Young
3       3  10/1/08      UK      F  25  3  5  5  5  2  Young
4       4 10/12/08      UK      M  39  3  3  4 NA NA  Young
5       5   5/1/09      UK      F  99  2  2  1  2  1  Elder

*注意:首先创建agecat变量以后要将agecat中的变量设为NA再依次执行语句,否则:

> leadership <- within(leadership,{
+ agecat [age>75] <- "Elder"
+ agecat[age<=75 & age>=55] <- "Middle aged"
+ agecat[age<55] <- "Young"
+ agecat[age==99] <- NA
+ })
Error in agecat[age > 75] <- "Elder" : object 'agecat' not found

会出现agecat不存在的提示

对于manager 5 中年龄=99可以认为是错误值,在进行分选之前先将99设置为NA,或者在对Elder设置范围时增加上限。

4.4 变量的重命名

最简单的方式就是使用fix()函数调出对话框,在框中直接进行变量重命名。

《R语言实战》学习笔记第四章_第1张图片

其次,是可以用names()函数

> names(leadership)
 [1] "manager" "date"    "country" "gender"  "age"     "q1"      "q2"      "q3"      "q4"      "q5"      "agecat" 
> names(leadership)[2] <- "testDate"
> names(leadership)
 [1] "manager"  "testDate" "country"  "gender"   "age"      "q1"       "q2"       "q3"       "q4"       "q5"      
[11] "agecat"  

然后,是使用plyr包中的rename()函数,格式为rename (mydata, c(oldname="newname",...))

> library(plyr)
> leadership <- rename(leadership,c(manager="managerID",testDate="Date"))
> leadership
  managerID     Date country gender age q1 q2 q3 q4 q5 agecat
1         1 10/24/08      US      M  32  5  4  5  5  5  Young
2         2 10/28/08      US      F  45  3  5  2  5  5  Young
3         3  10/1/08      UK      F  25  3  5  5  5  2  Young
4         4 10/12/08      UK      M  39  3  3  4 NA NA  Young
5         5   5/1/09      UK      F  99  2  2  1  2  1  Elder

4.5 缺失值

可以使用is.na()函数来判断数据中是否有缺失值,也可以使用 [] 定位到某行和列来缩小搜索范围。

例如:

> is.na(leadership[6:10])
     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

缺失值会返回为TRUE

*注意:缺失值无法被用来进行比较,且R不会把无法出现或者无限的值标记为缺失值。

缺失值可以使用函数中na.rm=TRUE选项来排除,排除以后可以进行运算。

na.omit()函数可删除不完整的观测

> na.omit(leadership)
  managerID     Date country gender age q1 q2 q3 q4 q5 agecat
1         1 10/24/08      US      M  32  5  4  5  5  5  Young
2         2 10/28/08      US      F  45  3  5  2  5  5  Young
3         3  10/1/08      UK      F  25  3  5  5  5  2  Young
5         5   5/1/09      UK      F  99  2  2  1  2  1  Elder

4.6 日期值

常用的日期格式见书P76

日期以字符串的形式输入到R中,使用as.Date()函数可将字符串转换为日期变量。

例如

> mydates <- c("01/05/1965","08/16/1965")
> dates <- as.Date(mydates,"%m/%d/%Y")
> dates
[1] "1965-01-05" "1965-08-16"

“”中的为mydates中日期的输入形式,asDate函数会将日期转化为默认格式yyyy-mm-dd

可以使用as.character()函数将日期转化为字符串

4.7 类型转换

常用的类型判断和转换函数见书P78,有numeric,character,vector,matrix,data.frame,factor,logical

4.8 数据排序

可以使用order()函数对一个数据进行排序,默认是升序排列,在排序变量前加减号(-)可以变为降序排列。

> leadership[order(age),]
  managerID     Date country gender age q1 q2 q3 q4 q5 agecat
3         3  10/1/08      UK      F  25  3  5  5  5  2  Young
1         1 10/24/08      US      M  32  5  4  5  5  5  Young
4         4 10/12/08      UK      M  39  3  3  4 NA NA  Young
2         2 10/28/08      US      F  45  3  5  2  5  5  Young
5         5   5/1/09      UK      F  99  2  2  1  2  1  Elder

*注意:order函数应该在方括号内(指定按照列还是行进行排序)

4.9 数据集的合并

横向连接

可以使用merge()函数对两个数据框进行横向连接,依据是使用两个数据框中的共有变量

total <- merge (dataframeA,dataframeB,by="ID")

上例中是让A和B数据框按照ID这一相同变量进行合并

还有cbind(A, B)函数,也是横向合并(c=column),且不需要指定公共索引,但是需要保证每个对象的行数相同并且以相同的顺序排列。

纵向连接

rbind(A,B)函数可以实现这一目标,但是对象中的变量必须一致,顺序可以不一致;若A或者B中有多余变量,要对数据进行预处理:

1. 删除A或B的多余变量

2. 在B或者A中追加新变量,并且设值为NA

4.10 数据集取子集

1. 选入数据

> newdata <- leadership[,c(6:10)]
> newdata
  q1 q2 q3 q4 q5
1  5  4  5  5  5
2  3  5  2  5  5
3  3  5  5  5  2
4  3  3  4 NA NA
5  2  2  1  2  1

选取原数据框中的行和列即可

还可以

> myvar <- c("q1","q2","q3","q4","q5")
> newdata <- leadership[myvar]
> newdata
  q1 q2 q3 q4 q5
1  5  4  5  5  5
2  3  5  2  5  5
3  3  5  5  5  2
4  3  3  4 NA NA
5  2  2  1  2  1

myvar引号中的变量名在leadership[]中充当了列的下标

还可以

> myvar <- paste("q",1:5,sep="")
> newdata <- leadership[myvar]
> newdata
  q1 q2 q3 q4 q5
1  5  4  5  5  5
2  3  5  2  5  5
3  3  5  5  5  2
4  3  3  4 NA NA
5  2  2  1  2  1

使用paste()函数连接字符串(意思为用“”中的内容连接q和1到5的数字

2. 剔除数据

> myvar <- names(leadership)%in%c("q3","q4")#首先names(leadership)返回了一个字符型变量,包含了leadership中所有的变量名,然后%in%后返回了一个逻辑型变量,在q3和q4的元素值都为TRUE
> newdata <- leadership[!myvar]#!将逻辑值反转,使q3和q4的元素值都为FALSE,leadership[]选择逻辑值为TRUE的值,则q3和q4被剔除
> newdata
  managerID     Date country gender age q1 q2 q5 agecat
1         1 10/24/08      US      M  32  5  4  5  Young
2         2 10/28/08      US      F  45  3  5  5  Young
3         3  10/1/08      UK      F  25  3  5  2  Young
4         4 10/12/08      UK      M  39  3  3 NA  Young
5         5   5/1/09      UK      F  99  2  2  1  Elder

弄清上述方法的逻辑顺序!

或者,在知道q3和q4是第8,9个变量时,使用如下语句

> newdata <- leadership[c(-8,-9)]
> newdata
  managerID     Date country gender age q1 q2 q5 agecat
1         1 10/24/08      US      M  32  5  4  5  Young
2         2 10/28/08      US      F  45  3  5  5  Young
3         3  10/1/08      UK      F  25  3  5  2  Young
4         4 10/12/08      UK      M  39  3  3 NA  Young
5         5   5/1/09      UK      F  99  2  2  1  Elder

列数前面加上减号(-),将列剔除

3. 选入观测

1.可以选入行下标,留空列下标,表示所有列皆被选入

> newdata <- with(leadership,leadership[gender=="M" & age>30,])
> newdata
  managerID     Date country gender age q1 q2 q3 q4 q5 agecat
1         1 10/24/08      US      M  32  5  4  5  5  5  Young
4         4 10/12/08      UK      M  39  3  3  4 NA NA  Young

以上是使用with()函数进行的,还可以使用attach()函数,入选的观测为1和4

2. 使用subset()函数

> rm(newdata)
> newdata <- subset(leadership,age>=35 | age< 24,select = age:q5)
> newdata
  age q1 q2 q3 q4 q5
2  45  3  5  2  5  5
4  39  3  3  4 NA NA
5  99  2  2  1  2  1

select=选项保留选中的列

4. 随机抽样

使用函数sample()从数据集中抽样

> mysample <- leadership[sample(1:nrow(leadership),3,replace = FALSE),]
> mysample
  managerID     Date country gender age q1 q2 q3 q4 q5 agecat
4         4 10/12/08      UK      M  39  3  3  4 NA NA  Young
2         2 10/28/08      US      F  45  3  5  2  5  5  Young
3         3  10/1/08      UK      F  25  3  5  5  5  2  Young
#replace=FALSE 表示不放回抽样,1:nrow(leadership)表示选中所有观测,3为抽样数目

你可能感兴趣的:(r语言,elementui,蓝桥杯)