R基础学习(二)基本数据管理

碎碎念

该部分还是基于书《R语言实战》,加上自己的一些实践和实验,希望自己可以努力,早日毕业!!

前提示例

研究问题:处于管理岗位的男女性在听从上级的程度上是否存在不同?这种情况是否依国家的不同而不同?
研究数据:让多个国家的经理人的上司对其服从程度打分,询问5个问题,针对这5个问题(q1-q5)进行打分,1-5分,数据如下

base4.csv
manager,date,country,gender,age,q1,q2,q3,q4,q5
1,2010/24/8,US,M,32,5,4,5,5,5
2,2010/28/8,US,F,45,3,5,2,5,5
3,2010/1/8,UK,F,25,3,5,5,5,2
4,2010/12/8,UK,M,39,3,3,4,
5,2005/1/9,UK,F,99,2,2,1,2,1

需要解决的问题:

  • 每位经理人需要生成一个评分
  • 缺失值的处理
  • 选择感兴趣的变量分析
  • 验证领导行为是否随着经理人的年龄发生变化
  • 选择特定时间范围内的数据进行分析

基础操作

1、运算符

(1)算数运算

运算符描述
+
-
*
/
^ or **求幂
x%%y求余数,7%%2 = 1
x%/%y求整数除法,7%%2 = 3

(2)逻辑运算

运算符描述
<小于
<=小于等于
>大于
>=大于等于
==严格求等,注意对浮点数进行运算可能会出错
!=不等于
!x非x
x | yx或y
x & yx和y
isTRUE(x)x是否是TRUE

(3)数据类型转化

在这里插入图片描述

2、缺省值

注意区分以下几个符号:

符号含义检验的函数
NANot Available,不可用,可以理解为不存在、缺省。is.na()
inf无穷,正无穷inf,负无穷-inf。is.infinite()
NaNnot a number,不是一个数,表示不可能的值,例如sin(inf)。is.nan()

关于缺省值需要注意:
(1)缺省值不可以比较,即使是和自己也不行,也就是说不能使用比较运算符来判断其是否存在。
(2)含有缺省值的算术表达式和函数计算结果也是缺省值。部分函数有na.rm参数,可以在计算之前移除缺省值,用剩余的数据进行计算。因此在处理含有缺省值的数据时,建议使用help()查询所用函数如何处理缺省值的。

x <- c(1,2,NA,3)
sum(x)
<返回值> NA
sum(x, na.rm=TRUE)
<返回值> 6

(3)可以通过na.omit()移除所有含有缺省值的行,即观测样本。

如何处理缺省值,还有更多的方法可以学习。(链接后续等学到再补)

3、日期

日期往往是以字符串的形式输入的,可以用as.Date()将其转化为以数值形式储存的日期变量。其基本语法为:

as.Date(x, "input_format")

# 以示例中的为例,存储的模式是四位数年份/日期/数字的月份
dataformat <- "%Y/%d/%m"
leadership$date <- as.Date(leadership$date, dataformat)

结果为:
在这里插入图片描述在这里插入图片描述
input_format是一组字符串,给出x中日期的储存格式。

符号含义
%d日期,数字,1~31
%a星期,缩写,例如 Mon
%A星期,全称,例如 Monday
%m月份,数字,01~12
%b月份,缩写,例如 Jan
%B月份,全称,例如 January
%y年份,两位数,例如 22
%Y年份,四位数,例如 2022

其他的基础函数:

Sys.Date() # 返回当天的日期
<返回值> "2022-11-16"
date() # 返回当前的日期和时间
<返回值> "Wed Nov 16 11:25:41 2022"

testdate <- as.Date("1999-11-28")
now <- Sys.Date()
difftime(now, testdate, units="weeks") # 计算日期间隔
<返回值> Time difference of 1198.429 weeks
difftime(now, testdate, units="days")
<返回值> Time difference of 8389 days

一些示例

示例一:求数据的和与均值并储存在数据框内

mydata <- data.frame(x1=c(2,2,4,6),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)

示例二:将一开始的示例中的年龄进行补充,并以55岁和75岁为界限分为Young,Middle Aged,Elder。

# 方法一
leadership$age[leadership$age==99] <- NA # 修改原有变量
leadership$agecat[leadership$age > 75] <- "Elder" # 创建新变量并赋值

# 方法二,使用within(),与with()不同的是它允许修改数据框内的数据
leadership <- within(leadership, {
  age[age==99] <- NA # 排查缺省值
  agecat <- NA # 创建一个新的agecat变量并初始化为缺省值
  agecat[age > 75] <- "Elder"
  agecat[age >= 55 & age <= 75] <- "Middle Aged"
  agecat[age < 55] <- "Young"
})

结果为:
在这里插入图片描述在这里插入图片描述

示例三:将date重命名为testDate

# 方法一:使用names()
names(leadership)
names(leadership)[2] <- "testDate"
names(leadership)
<返回值> 
 [1] "manager" "date"    "country" "gender"  "age"     "q1"      "q2"      "q3"      "q4"      "q5"     
[11] "agecat" 
<返回值>
 [1] "manager"  "testDate" "country"  "gender"   "age"      "q1"       "q2"       "q3"       "q4"      
[10] "q5"       "agecat" 
# 方法二:使用plyr,注意该函数需要先安装,install.packages("plyr")
library(plyr)
leadership <- rename(leadership, c(manager="ID", date="testDate"))

示例四:排序

# 方法一:order(), 返回值为索引
order(..., # vectors,排序的数据,
      na.last = TRUE,  # 缺省值的位置,默认是在最后
      decreasing = FALSE, # 升序(FALSE) or 降序(TRUE)
      method = c("auto", "shell", "radix")
      )
order(leadership$age)
<返回值> 3 1 4 2 5

test <- c("I","am","looking","forward","to","the","weekend")
test[order(test)]
<返回值> "am"      "forward" "I"       "looking" "the"     "to"      "weekend"

# 方法二:sort(),返回值为排序后的结果
sort(x, decreasing = FALSE,
     na.last = NA # TRUE:将缺省值放在最后,FALSE:将缺省值放在开始,NA:删除缺省值)

sort(leadership$age)
<返回值> 25 32 39 45
sort(leadership$age, na.last = TRUE)
<返回值> 25 32 39 45 NA

示例五:合并,添加

数据如下:

dataA1 = data.frame(ID=c(1,2,3),
                    country=c("US","US","UK"),
                    gender=c("M","F","F"),
                    age=c(32,45,25))
dataA2 = data.frame(ID=c(4,5),
                    country=c("UK","US"),
                    gender=c("M","F"),
                    age=c(39,NA))
dataB1 = data.frame(ID=c(1,2,3),
                   q1=c(5,3,3),
                   q2=c(4,5,5))
dataB2 = data.frame(ID=c(4,5),
                   q1=c(3,2),
                   q2=c(3,2))

在这里插入图片描述

# 直接合并矩阵或数据框,不指定公共索引
cbind(dataA1,dataB1) # 横向合并,要求行数相同
<返回值>
  ID country gender age ID q1 q2
1  1      US      M  32  1  5  4
2  2      US      F  45  2  3  5
3  3      UK      F  25  3  3  5

rbind(dataA1,dataA2) # 纵向合并,要求列数相同
<返回值>
  ID country gender age
1  1      US      M  32
2  2      US      F  45
3  3      UK      F  25
4  4      UK      M  39
5  5      US      F  NA

rbind(dataA1,dataB2)
<返回警告> Error in rbind(deparse.level, ...) : 变量的列数不对

# 指定公共索引
merge(dataA1,dataB1, by="ID") # 指定多个索引 by=c("ID", "country")
<返回值>
  ID country gender age q1 q2
1  1      US      M  32  5  4
2  2      US      F  45  3  5
3  3      UK      F  25  3  5

示例六:删除

  • 删除某些行或者某些列:
# 方法一:用 -索引 删除
leadership[c(-1,-2),] # 删除1、2行,也就是观测值,注意这里的逗号!
<返回值>
  manager       date country gender age q1 q2 q3 q4 q5 agecat
3       3 2010-08-01      UK      F  25  3  5  5  5  2  Young
4       4 2010-08-12      UK      M  39  3  3  4 NA NA  Young
5       5 2005-09-01      UK      F  NA  2  2  1  2  1   <NA>

leadership[c(-1,-2)] # 删除1、2列,也就是变量
<返回值>
  country gender age q1 q2 q3 q4 q5 agecat
1      US      M  32  5  4  5  5  5  Young
2      US      F  45  3  5  2  5  5  Young
3      UK      F  25  3  5  5  5  2  Young
4      UK      M  39  3  3  4 NA NA  Young
5      UK      F  NA  2  2  1  2  1   <NA>

# 方法二:用命名删除
myvars <- names(leadership) %in% c("q3","q4") # 对比列名中q3,q4所在的位置,返回是布尔值向量
leadership[! myvars] # 取反,索引
<返回值>
  manager       date country gender age q1 q2 q5 agecat
1       1 2010-08-24      US      M  32  5  4  5  Young
2       2 2010-08-28      US      F  45  3  5  5  Young
3       3 2010-08-01      UK      F  25  3  5  2  Young
4       4 2010-08-12      UK      M  39  3  3 NA  Young
5       5 2005-09-01      UK      F  NA  2  2  1   <NA>

mysimp <- row.names(leadership) %in% c("1","3")
leadership[! mysimp,] # 同样注意这个逗号!
<返回值>
  manager       date country gender age q1 q2 q3 q4 q5 agecat
2       2 2010-08-28      US      F  45  3  5  2  5  5  Young
4       4 2010-08-12      UK      M  39  3  3  4 NA NA  Young
5       5 2005-09-01      UK      F  NA  2  2  1  2  1   <NA>

# 也可以通过确定命名所在的位置索引,利用索引的方法删除元素
# 查找索引的方法有:
which(c("a","v","cc","c","b") %in% "c")
<返回值> 4
grep("c", c("a","v","cc","c","b")) # 该元素只要出现就会识别到
<返回值> 3 4
  • 删除某些元素:
# 按照索引删除元素
leadership[! mysimp, ! myvars]
leadership[-c(1,3), -c(8,9)]
<返回值>
  manager       date country gender age q1 q2 q5 agecat
2       2 2010-08-28      US      F  45  3  5  5  Young
4       4 2010-08-12      UK      M  39  3  3 NA  Young
5       5 2005-09-01      UK      F  NA  2  2  1   <NA>

# 操作具体的值来删除元素
subset(x, 
       subset, # 逻辑判别式,填写需要保留的项目
       select,  # 需要保留的区域,主要是变量区域
       drop = FALSE)

# 删除q3q4
subset(leadership, select=-c(8,9))
# 删除年龄在25-30岁之间的样本 -> 保留年龄大于30岁或者小于25岁的样本
subset(leadership, age >= 30 | age < 25)
<返回值>
  manager       date country gender age q1 q2 q3 q4 q5 agecat
1       1 2010-08-24      US      M  32  5  4  5  5  5  Young
2       2 2010-08-28      US      F  45  3  5  2  5  5  Young
4       4 2010-08-12      UK      M  39  3  3  4 NA NA  Young
# 删除年龄在25-30岁之间的样本,并只要他们的评分部分
subset(leadership, age >= 30 | age < 25, select=q1:q5)
<返回值>
  q1 q2 q3 q4 q5
1  5  4  5  5  5
2  3  5  2  5  5
4  3  3  4 NA NA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值