当前位置:   article > 正文

R语言总结(一)_r语言表是0-9数字

r语言表是0-9数字

前言:想要练习数据可以私信哦~

快捷键:

运行:CTRL+ENTER

赋值<-:ALT+-

目录

一:R语言的基础运算

二:R的数据类型

三:数据录入

四:字符串变量的整理

五:时间日期向量

六:数据管理--缺失值处理

七:数据管理--变量计算、重新编码

八:ifelse判断语句 

九:for循环运算结果的导出

一:R语言的基础运算

第一部分:赋值
age <- c(21, 22.3, 23, 19.8, 22.9, 20)
BMI <- c(20.3, 19.5, 19.8, 21.2, 22.3, 19.6)
student_ID <- c('No.1', 'No.2', 'No.3', 'No.4', 'No.5', 'No.6')
data.frame(student_ID, age, BMI)  #生成表格
mydata <- data.frame(student_ID, age, BMI)
mydata

运行结果:

    student_ID  age  BMI
1       No.1  21.0 20.3
2       No.2  22.3 19.5
3       No.3  23.0 19.8
4       No.4  19.8 21.2
5       No.5  22.9 22.3
6       No.6  20.0 19.6

第二部分:四则运算
72/10
72 %/% 10   #取整%/%
72 %% 10   #取余
ceiling(7.2) #向上取整
floor(7.2) #向下取整
5 ^ 2
6 ** 2 #乘方
sqrt(100) #开方

运行结果:
> 72/10
[1] 7.2
> 72 %/% 10 #取整%/%
[1] 7
> 72 %% 10 #取余
[1] 2
> ceiling(7.2)#向上取整
[1] 8
> floor(7.2)#向下取整
[1] 7
> 5 ^ 2
[1] 25
> 6 ** 2#乘方
[1] 36
> sqrt(100)#开方
[1] 10
> #第三部分:三角函数运算
> #三角函数输入的数据是弧度,180°=π弧度,1°=π/180
> sin(pi/180*30) #sin30°
[1] 0.5
> #第四部分:对数函数log(x,base=10)
> log(64, base = 8)#8的几次方等于64
[1] 2
> log(25)#如果省略base,默认底数是e=2.718282 ln(x)
[1] 3.218876
> #第五部分:指数函数exp(x)
> exp(1)
[1] 2.718282
> exp(2)
[1] 7.389056
> log(exp(3.7))
[1] 3.7
> log(exp(1))
[1] 1
> #第六部分:简单统计运算
> mydata
  student_ID  age  BMI
1       No.1 21.0 20.3
2       No.2 22.3 19.5
3       No.3 23.0 19.8
4       No.4 19.8 21.2
5       No.5 22.9 22.3
6       No.6 20.0 19.6
> mean(age) #均值
[1] 21.5
> sd(age) #标准差
[1] 1.431084
> var(age) #方差
[1] 2.048
> range(age) #范围
[1] 19.8 23.0
> median(age) #中位数
[1] 21.65
> quantile(age) #四分位数
   0%   25%   50%   75%  100% 
19.80 20.25 21.65 22.75 23.00 
> max(age) #最大值
[1] 23
> min(age) #最小值
[1] 19.8
> #第七部分:绝对值、四舍五入
> abs(-3) #绝对值
[1] 3
> abs(5)
[1] 5
> pi
[1] 3.141593
> round(pi,2)#保留两位小数
[1] 3.14
> #第八部分:比较大小
> #大于(>), 小于(<), 小于等于(<=), 等于(==),不等于(!=)
> 5 > 4
[1] TRUE
> 6 > 8
[1] FALSE
> 9 >= 12
[1] FALSE
> 8 >= 8
[1] TRUE
> 1 != 2
[1] TRUE
> #第九部分:且(& 两边都是true),或(| 一边有true),非(!取反)
> 3 > 2 & 5 > 6
[1] FALSE
> 3 > 2 | 5 > 6
[1] TRUE
> !(3 > 10)
[1] TRUE

二:R的数据类型

R最常处理的数据结构是:向量、数据框、列表、矩阵

向量:数据分析中的变量,数值型向量,字符型向量和逻辑型向量等,如age=18

> ##########NO.5数据类型介绍############
> #1、向量vector
> age #数值型向量
[1] 21.0 22.3 23.0 19.8 22.9 20.0
> BMI 
[1] 20.3 19.5 19.8 21.2 22.3 19.6
> View(mydata)
> gender <- c("female", "male", "female", "male", "male", "female")
> gender #字符型向量
[1] "female" "male"   "female" "male"   "male"   "female"
> selected <- ifelse(BMI > 20, TRUE, FALSE)
> selected #逻辑型向量
[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

 #2、数据框data.frame
#形成数据框的函数data.frame
mydata2 <- data.frame(mydata, gender, selected)
View(mydata2)

#3、向量和数据框中元素的调用
> mydata2[4,'selected'] #数据框元素调用的规则mydata2[行,列]
[1] TRUE
> mydata2[4,5]
[1] TRUE
> mydata2[,3]#第三列的数据
[1] 20.3 19.5 19.8 21.2 22.3 19.6
> mydata2[,'BMI']#查询BMI的数据
[1] 20.3 19.5 19.8 21.2 22.3 19.6
> mydata2[2,]#第二行数据
  student_ID  age  BMI gender selected
2       No.2 22.3 19.5   male    FALSE
> mydata2[,-3]#不要第三列
  student_ID  age gender selected
1       No.1 21.0 female     TRUE
2       No.2 22.3   male    FALSE
3       No.3 23.0 female    FALSE
4       No.4 19.8   male     TRUE
5       No.5 22.9   male     TRUE
6       No.6 20.0 female    FALSE
> mydata2[-1,]#不要第一行
  student_ID  age  BMI gender selected
2       No.2 22.3 19.5   male    FALSE
3       No.3 23.0 19.8 female    FALSE
4       No.4 19.8 21.2   male     TRUE
5       No.5 22.9 22.3   male     TRUE
6       No.6 20.0 19.6 female    FALSE
> mydata2[c(1,3,5),]#挑选1,3,5行
  student_ID  age  BMI gender selected
1       No.1 21.0 20.3 female     TRUE
3       No.3 23.0 19.8 female    FALSE
5       No.5 22.9 22.3   male     TRUE
> mydata2[,c(1,3,5)]#挑选1,3,5列
  student_ID  BMI selected
1       No.1 20.3     TRUE
2       No.2 19.5    FALSE
3       No.3 19.8    FALSE
4       No.4 21.2     TRUE
5       No.5 22.3     TRUE
6       No.6 19.6    FALSE
> #数据框是面,是二维的,包括行和列,所谓调用元素必须给出行和列的信息
> #向量是线,是一维的。var[]
> age
[1] 21.0 22.3 23.0 19.8 22.9 20.0
> age[3]
[1] 23
> age[-1] #不要第一个
[1] 22.3 23.0 19.8 22.9 20.0
> age[-c(1,3,4)] #不要第1,3,4
[1] 22.3 22.9 20.0

> #4、矩阵matrix
> 5*6
[1] 30
> samp <- matrix(1:30,nrow = 5,ncol = 6)#生成5行6列,1-30的数
> samp
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    6   11   16   21   26
[2,]    2    7   12   17   22   27
[3,]    3    8   13   18   23   28
[4,]    4    9   14   19   24   29
[5,]    5   10   15   20   25   30
> samp[2,4]#取第二行第四列的数
[1] 17
> colnames(samp) <- c('col_1', 'col_2', 'col_3', 'col_4', 'col_5', 'col_6')#改行名
> samp
     col_1 col_2 col_3 col_4 col_5 col_6
[1,]     1     6    11    16    21    26
[2,]     2     7    12    17    22    27
[3,]     3     8    13    18    23    28
[4,]     4     9    14    19    24    29
[5,]     5    10    15    20    25    30
> #5、列表list
> #列表包容性强,是一个大杂烩。(收纳整理)
> a
[1] 1
> mylist <- list(mydata, a, gender, selected, samp)
> mylist
[[1]]
  student_ID  age  BMI
1       No.1 21.0 20.3
2       No.2 22.3 19.5
3       No.3 23.0 19.8
4       No.4 19.8 21.2
5       No.5 22.9 22.3
6       No.6 20.0 19.6

[[2]]
[1] 1

[[3]]
[1] "female" "male"   "female" "male"   "male"  
[6] "female"

[[4]]
[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

[[5]]
     col_1 col_2 col_3 col_4 col_5 col_6
[1,]     1     6    11    16    21    26
[2,]     2     7    12    17    22    27
[3,]     3     8    13    18    23    28
[4,]     4     9    14    19    24    29
[5,]     5    10    15    20    25    30

> names(mylist) <- c('mydata', 'a', 'gender', 'selected', 'samp') #改列表中的名字
> mylist
$mydata
  student_ID  age  BMI
1       No.1 21.0 20.3
2       No.2 22.3 19.5
3       No.3 23.0 19.8
4       No.4 19.8 21.2
5       No.5 22.9 22.3
6       No.6 20.0 19.6

$a
[1] 1

$gender
[1] "female" "male"   "female" "male"   "male"  
[6] "female"

$selected
[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

$samp
     col_1 col_2 col_3 col_4 col_5 col_6
[1,]     1     6    11    16    21    26
[2,]     2     7    12    17    22    27
[3,]     3     8    13    18    23    28
[4,]     4     9    14    19    24    29
[5,]     5    10    15    20    25    30

> mylist$mydata[3,2]#查找列表中的mydata数据框第三行第二列的元素
[1] 23
> mylist$selected[5]#查找向量
[1] TRUE
> mylist$samp[2,4]
col_4 
   17 

> #6、什么时候加"",也可以使用'',不过""更严谨
> #录入内容是字符串的时候,必须要加""
> p <- 23.36256
> p*2
[1] 46.72512
> p*4
[1] 93.45024
> sqrt(p)
[1] 4.833483
> K <- "天天开心"

三:数据录入

#1、键盘手动录入数据

需要导入的数据框: 


Patient_ID <- c('NO.1', 'NO.2',
                'NO.3', 'NO.4',
                'NO.5', 'NO.6',
                'NO.7', 'NO.8',
                'NO.9', 'NO.10')
Gender <- c('male', 'male',
            'female', 'female',
            'female', 'female',
            'female', 'female',
            'female', 'male')
Age <- c(67, 67, 60, 69, 80, 63, 55, 66, 47, 62)
mydata1 <- data.frame(Patient_ID, Gender, Age) #合并数据
View(mydata1)   #查看数据表

              

 edit(mydata1) #修改数据
mydata2 <- edit(mydata1)  #告诉系统修改后生成一个新的数据框mydata2

mydata1 <- edit(mydata1) #覆盖 

#2、txt格式数据的导入(txt格式推荐使用写代码导入)
#导入txt格式数据用到的函数是read.table
mydata3 <- read.table("C:/Users/ASUS/Desktop/R语言配套资料/配套资料/NO.7_配套资料/NO.7_txt格式数据导入.txt"
                      ,header = TRUE)#表示第一行为变量名
#重点:R软件不能识别\的路径,R软件只能识别/或者\\的路径

#3.excel格式数据导入(既可以通过代码,也可以通过鼠标点击)
#导入excel格式数据用到的函数是read_excel,这个函数所在的程序包readxl不是R自带的
#因此,使用之前需要install,然后再library
mydata5 <- NO_7_excel格式数据 #替换名字
mydata5$性别 <- factor(mydata5$性别, levels = c(1,2), labels = c('男','女'))
#mydata5性别的变量里面的1,2替换成男和女,并且替换的结果作为factor存在的
View(mydata5)

#4.csv格式数据导入(只能通过代码,不能通过鼠标点击)
#导入csv格式数据用到的函数是read.csv,这个函数所在的utils程序包是R自带的
mydata6 <- read.csv('C:\\Users\\ASUS\\Desktop\\R语言配套资料\\配套资料\\NO.7_配套资料\\NO.7_csv格式数据.csv')
mydata6$性别 <- factor(mydata6$性别, levels = c(1,2), labels = c('男','女'))
mydata6$家乡 <- factor(mydata6$家乡, levels = c(1,2,3,4), labels = c('农村', '镇(非农业人口)', '县城(或县级市)', '县级以上城市'))
View(mydata6)

#5.SPSS格式数据导入(既可以通过代码,也可以通过鼠标点击)
mydata7 <- NO_7_SPSS格式数据 #改数据框的名字

四:字符串变量的整理

#字符串的定义:只要内容加上了单引号或者双引号,那么这个内容就是字符串
#对于阿拉伯数字,既可以是字符也可以是数字

用到的数据表:

#1.求字符串的长度
nchar(mydata$职业)

#2.查找(查找字符串的各个元素中是否包含目标字符)
#以上的查找要求使用的函数是grep或grepl(t f)
#grep('目标字符', 字符串变量)
#grepl('目标字符', 字符串变量)
grep('辛辣', mydata$饮食偏好)#查找mydata中饮食偏好这一栏中是否有‘辛辣’两个字
grepl('辛辣', mydata$饮食偏好)
as.numeric(grepl('辛辣', mydata$饮食偏好))#把true和false转换成阿拉伯1/0
mydata$辛辣 <- as.numeric(grepl('辛辣', mydata$饮食偏好))#在mydata中生成辛辣列表
mydata$高脂肪饮食猪肉 <- as.numeric(grepl('高脂肪饮食猪猪猪肉', mydata$饮食偏好))
mydata$高盐 <- as.numeric(grepl('高盐', mydata$饮食偏好))
mydata$喜油腻 <- as.numeric(grepl('喜油腻', mydata$饮食偏好))
mydata$动物内脏 <- as.numeric(grepl('动物内脏', mydata$饮食偏好))

#3.提取(提取字符串中的部分字符串)
#提取函数:substr
#substr(字符串,开始位置,结束位置)
mydata$出身年份 <- substr(mydata$身份证号, 7, 10)#此时截取出来的是字符型,为了计算年龄,需要转换成数字型
mydata$出身年份 <- as.numeric(mydata$出身年份)
str(mydata$出身年份)

#4.替换/删除
#gsub('被替换的内容','替换内容',字符串)
#4.1  gsub的删除用法
#提取mydata$姓名编号中的姓名,删除编号
#将编号替换成没有任何内容
gsub('[0-9]', '', mydata$姓名编号)
mydata$姓名 <- gsub('[0-9]', '', mydata$姓名编号)

#提取mydata$姓名编号中的编号,删除姓名
#将姓名替换成没有任何内容
mydata$编号 <- gsub('[^0-9]', '', mydata$姓名编号)#[^0-9]表示阿拉伯数字0-9的补集(除了阿拉伯数字之外的内容)
 


#4.2  gusb的替换用法
#需要把身份证号中的x替换成'保密数字'
mydata$身份证号 <- gsub('X', '保密数字', mydata$身份证号) 

 

#4.3  substr函数也可以替换
#将身份证号中的出生年份隐藏,替换成xxx
#由于出身年份每个人不一样,没有共同特征,用gusb不好操作
#substr(字符创,开始位置,结束位置) <- '目标内容'
mydata$隐匿年份 <- mydata$身份证号
substr(mydata$隐匿年份, 7, 10) <- 'xxxx'

#5.粘贴paste paste0
#paste(变量1,变量2,sep='*')用*隔开
mydata$姓名编号2 <- paste(mydata$姓名, mydata$编号, sep = '*')
mydata$姓名编号3 <- paste(mydata$姓名, mydata$编号, sep = '')
mydata$姓名编号4 <- paste0(mydata$姓名, mydata$编号)#和上一条用法一样

                                

#6.查找(查找某一个具体内容在在字符串中的位置)
#regexpr('具体内容',字符串,fixed = TRUE)
#查找mydata姓名编号2中星号的位置,注意要加 fixed = TRUE 精准定位
mydata$星号位置 <- regexpr('*', mydata$姓名编号2, fixed = TRUE) 

           

#7.拆分
#strsplit(字符串,split = '', fixed = TRUE)
aaa <- strsplit(mydata$姓名编号2, split = '*' ,fixed = TRUE)#以星号进行拆分
#strsplit拆分后的结果不是变量,软件没法直接把拆分后的结果放进原来的数据
#strsplit拆分后的结果是列表list,我们需要把list转成matrix或者vector或者data.frame才可以放进数据框

# do.call可以把list转换成矩阵
# do.call(rbind,list名字)rbind行合并

aaa <- do.call(rbind,aaa)
aaa <- data.frame(aaa)#转换成数据框
colnames(aaa) <- c('姓名2', '编号2')
mydata <- data.frame(mydata, aaa)

 

五:时间日期向量

需要用到的表:

 #1、日期向量Date   YYYY-mm-dd
#2、时间向量POSIXct   YYYY-mm-dd HH:MM:SS

l <- c("2022-11-22",'2022-11-01','2022-11-03')
#日期是以字符型的形式进入R的,进入后需要人为转换成Date形式
l <- as.Date(l)#转换成Date才能计算时间差
k <- c('2022-11-22 17:06:23', '2022-11-28 19:12:06', '2023-7-13 13:38:26')
k <- as.POSIXct(k)#转换成时间向量

> #3、lubridate针对时间日期变量的程序包
> library(lubridate)
> #3.1 提取日期和时间向量的年、月、日、季度
> year(l)
[1] 2022 2022 2022
> month(l)
[1] 11 11 11
> day(l)
[1] 22  1  3
> quarter(l)
[1] 4 4 4
> 
> year(k)
[1] 2022 2022 2023
> month(k)
[1] 11 11  7
> day(k)
[1] 22 28 13
> quarter(k)
[1] 4 4 3
> hour(k)
[1] 17 19 13
> minute(k)
[1]  6 12 38
> second(k) #秒
[1] 23  6 26

#4时间向量和日期向量的加减法
> #日期向量天数变化,时间向量秒数变化
> l
[1] "2022-11-22" "2022-11-01" "2022-11-03"
> s <- l+3 #增加3天
> s
[1] "2022-11-25" "2022-11-04" "2022-11-06"
> 
> k
[1] "2022-11-22 17:06:23 CST"
[2] "2022-11-28 19:12:06 CST"
[3] "2023-07-13 13:38:26 CST"
> f <- k+30
> f
[1] "2022-11-22 17:06:53 CST"
[2] "2022-11-28 19:12:36 CST"
[3] "2023-07-13 13:38:56 CST"

#5、实例演示时间差、日期差的计算方法
mydata <- NO_9_配套数据
str(mydata)

#5.1 使用lubridate程序包中的ymd函数把变量类型改成Date
mydata$入院日期 <- ymd(mydata$入院日期)#把变量日期改成Date
mydata$手术日期 <- ymd(mydata$手术日期)

#5.2 生成正确的时间变量 
mydata$手术开始_完整时间 <- paste(mydata$手术日期,
                          mydata$手术开始时间, 
                          sep = ' ')
mydata$手术结束_完整时间 <- paste(mydata$手术日期,
                          mydata$手术结束时间,
                          sep = ' ')

mydata$出院日期 <- ymd(mydata$出院日期)
mydata$手术开始_完整时间 <- ymd_hms(mydata$手术开始_完整时间)
mydata$手术结束_完整时间 <- ymd_hms(mydata$手术结束_完整时间)

#5.3 计算时间差
mydata$手术等待时间 <- difftime(mydata$手术日期, 
                          mydata$入院日期, 
                          units = 'days')#以天进行计算
mydata$手术时长 <- difftime(mydata$手术结束_完整时间,
                        mydata$手术开始_完整时间,
                        units = 'hours')#以小时为单位

六:数据管理--缺失值处理

> #1.R语言缺失值表达形式NA(not available)
> score <- c(92,91,NA,62,NA,85,88,NA,92,NA)
> score
 [1] 92 91 NA 62 NA 85 88 NA 92 NA
> 

> #2.缺失值数量计算--计算变量中几个缺失值
> #缺失值数量计算的函数是summary()
> summary(score)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  62.00   85.75   89.50   85.00   91.75   92.00 
   NA's 
      4 

 #3查找缺失值的位置
> #缺失值位置查找函数是is.na()
> #is.na():将向量中的每一个元素根据是否是缺失值而转成一个逻辑形式
> is.na(score)
 [1] FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE  TRUE
 [9] FALSE  TRUE
> #用which函数查找缺失值的位置
> which(is.na(score))
[1]  3  5  8 10

 #4.如何忽略缺失值
> #省略缺失值的函数是na.omit()
> score
 [1] 92 91 NA 62 NA 85 88 NA 92 NA
> na.omit(score) #忽略缺失值
[1] 92 91 62 85 88 92
attr(,"na.action")
[1]  3  5  8 10
attr(,"class")
[1] "omit"
> mean(na.omit(score)) #计算除了NA的平均值
[1] 85

#5.缺失值的处理
#5.1 缺失值占比比较多:缺失值占比>80%,那么,这一列向量可以直接
#删除,没有进行数据分析的价值了。

#5.2 缺失值在可接受范围内:缺失值在30%-80%之间,此时可以把缺失值单独作为一个类别。
score[c(1,2,7)] #查找1,2,7分数
score[which(is.na(score))] <- 9999 #显示所有缺失值,并赋值9999
score

#5.3 缺失值占比比较少:缺失值占比<30%,则可以对缺失值进行填补
#5.3.1 连续型变量(数值型向量)的缺失值填补
#5.3.1.1 服从正态分布的连续型变量选择均值来填补缺失值

mydata <- NO_10_配套数据
class(mydata)
mydata <- as.data.frame(mydata)#转成传统的data.frame
summary(mydata)#统计数据
#第六列臀围NA数据比较多,需要删除(mydata[,-列])行保留
#数据框的向量或者元素的调用
数据框$变量名
数据框[行,列]
mydata2 <- mydata[,-6]
summary(mydata2)
#因为是否正态性决定了缺失值填补的内容,所以第一步是要检验正态性
shapiro.test(mydata2$LDL) #对向量进行正态性检验
#得出p>0.05,服从正态分布,因此原则均值来填补两个缺失值。
which(is.na(mydata2$LDL))#找出两个缺失值的位置
mydata2$LDL[which(is.na(mydata2$LDL))] <- mean(na.omit(mydata2$LDL))#省略缺失值,计算平均值 

 #5.3.1.2 不服从正态分布的连续型变量选择中位数来填补缺失值
#对向量进行正态性检验
#得出p<0.05,服从正态分布,因此原则中位数来填补缺失值。median求中位数

shapiro.test(mydata2$TG)
mydata2$TG[which(is.na(mydata2$TG))] <-median(na.omit(mydata2$TG)) 

 #5.3.2 分类型变量(字符型变量)的缺失值填补
summary(mydata2$严重程度)
#当分类型变量录入值是字符型,那么NA也会计算到字符里面,所以显示不出缺失数量
summary(mydata2$性别)
mydata2$性别2 <- factor(mydata2$性别,levels = c('男','女'), labels = c(1,2))
which(is.na(mydata2$性别2))
mydata2$严重程度 <- factor(mydata2$严重程度 ,levels = c(1,2,3,4),labels = c('轻度','中度','中重度','重度'))
#注意,此处分为了四个字符因子c('轻度','中度','中重度','重度'),所以可以判断是否为NA
summary(mydata2$严重程度)
#分类型变量(字符型变量)的缺失值应该选择众数来填补
#众数是出现字符最多类别
mydata2$严重程度[which(is.na(mydata2$严重程度))] <- '中重度'

 七:数据管理--变量计算、重新编码

           

 #1.计算变量   以计算BMI为例
#BMI = 体重(KG)/(身高m*身高m)
mydata$身高 <- mydata$身高/100
mydata$BMI <- mydata$体重/(mydata$身高*mydata$身高)

#2.变量的重新编码
#问卷的Q10属于逆向题,为了和纬度中其他题项的方向保持一致
#因此,需要对Q10进行逆向处理
#原来的12345要转成54321
#逆向的重新编码需要用到的函数是recode,这个函数所在的程序包是car程序包
library(car)
mydata$Q10逆 <- recode(mydata$Q10, "1 = 5; 2 = 4; 3 = 3; 4 = 2; 5 = 1") 

#3.数据框中列位置的调整
mydata <- mydata[,c(1:14, 26, 15:25)] #26列插入到14到15列之间
mydata$行为不当得分 <- (mydata$Q1+mydata$Q8+mydata$Q10+mydata$Q14+mydata$Q16+mydata$Q19)/6 

#4.变量分段
#BMI的划分标准:偏瘦BMI<18.5;正常BMI[18.5,24)
#偏瘦BMI[24,27.9],肥胖BMI>27.9
mydata$BMI分类[mydata$BMI < 18.5] <- "偏瘦"
mydata$BMI分类[mydata$BMI < 24 & mydata$BMI >= 18.5] <- '正常'
mydata$BMI分类[mydata$BMI < 28 & mydata$BMI >= 24] <- '偏胖'
mydata$BMI分类[mydata$BMI >= 28] <- "肥胖" 

八:ifelse判断语句 

> #1.ifelse代码结构
> #ifelse(条件,满足条件的后果,不满足条件的后果)
> #实例1:
> #爹:如果你的考试成绩在90以上,我就给你买一个奥特曼,否则不买
> x <- 85
> x
[1] 85
> ifelse(x > 90, '买奥特曼', '不买奥特曼')
[1] "不买奥特曼"
> 
> #80-90分之间,买一个小奥特曼, >90分买大奥特曼,<80分什么都不买
> ifelse(x <= 90 & x >= 80, '买小奥特曼', 
+        ifelse(x > 90, '买大奥特曼', '什么都不买'))
[1] "买小奥特曼"
> x1 <- 55
> ifelse(x1 <= 90 & x1 >= 80, '买小奥特曼', 
+        ifelse(x1 > 90, '买大奥特曼', '什么都不买'))
[1] "什么都不买"
> #以上的例子中,仅仅针对一个单一的数值来实现的ifelse,那么
> #如果我的研究对象是一列向量,ifelse仍然可以使用

#实例2:一年级有200名学生,判别这些学生的成绩等相关情况
#及格的判别标准>=60为及格,否则,不及格
mydata$是否及格 <- ifelse(mydata$成绩 >= 60, '及格', '不及格')

#总结:ifelse既可以对单个数值进行判断,也可以针对一列向量进行判断

                     

> #2 if else语法结构
> #if(条件){
> #  满足条件的结果
> #}else{
> #  不满足条件的结果
> #}
> 
> #实例3:<60不及格,60-70良好,71-80良好,>80优秀
> h <- 85
> #3.1使用ifelse
> ifelse(h < 60, '不及格', ifelse(h<=70, '中等', ifelse(h <= 80, '良好','优秀')))
[1] "优秀"
> 
> #3.2 使用 if else 
> # <60不及格,60-70良好,71-80良好,>80优秀
> h <- 76
> if(h<60){
+   print('不及格')
+ }else{
+   if(h <= 70){
+     print('中等')
+   }else{
+     if(h <= 80){
+       print('良好')
+     }else{
+       print('优秀')
+     }
+   }
+ }
[1] "良好"
> #3.3 多条分组
> #举例 :女生身高达标标准是:>=160
> #       男神身高达标标准是:>=170
> #性别条件是1,身高条件是2
> gender <- '女'
> height <- 165
> if(gender == '女'){
+   print(ifelse(height >= 160, '达标', '不达标'))
+ }else{
+   print(ifelse(height >= 170, '达标', '不达标'))
+ }
[1] "达标"
> 
> 
> gender <- '男'
> height <- 169
> if(gender == '女'){
+   print(ifelse(height >= 160, '达标', '不达标'))
+ }else{
+   print(ifelse(height >= 170, '达标', '不达标'))
+ }
[1] "不达标"
#if else只能针对单个数值,当研究对象是一列向量时,if else 函数需要结合循环语句来实现

九:for循环运算结果的导出

 #1.将R运算结果导出为csv格式
write.csv(mydata, 'mydata.csv')
getwd()

#循环运算结果的输出
身高达标 <- NULL
for(i in 1:149){
 dd <-  if(mydata$性别[i] == 1){
    print(ifelse(mydata$身高[i] >= 170, '达标', '不达标'))
  }else{
    print(ifelse(mydata$身高[i] >= 160, '达标', '不达标'))
  }
 身高达标 <- rbind(身高达标,dd)#纵向排列
}
mydata$身高达标 <- 身高达标
mydata <- data.frame(mydata, 身高达标)
write.csv(mydata, 'mydata.csv')
 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号