前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础知识 | R语言数据管理之数据集取子集

基础知识 | R语言数据管理之数据集取子集

作者头像
黑妹的小屋
发布2020-08-06 15:00:59
2.5K0
发布2020-08-06 15:00:59
举报
文章被收录于专栏:菜鸟学数据分析之R语言

R语言数据管理之数据集取子集

在做任何数据分析的第一步,是根据个人需求创建数据集,存储数据的结构是多样的,包括向量,矩阵、数据框、因子以及列表等。其实,以上几个R语言的独特术语,在C++中也会经常用到,导致很多人都会误认为自己很熟悉了,然而在实际的应用中,却经常出现错误。最近在处理一波量大的数据,在运行程序的过程中,因为前期数据处理错误却出现各种bug,经过检查数据集发现是数据管理的问题,为了巩固R语言的基本数据管理,特地重新基础知识。

01

选取变量

#构建数据框

代码语言:javascript
复制
> PatientID<-c(1,2,3,4,5,6)
> Data<-c("03/20/20","03/21/20","03/22/20","03/23/20","03/24/20","03/25/20")
> Age<-c(18,25,26,35,48,50)
> Gender<-c("M","F","F","M","F","M")
> City<-c("福州","厦门","泉州","龙岩","漳州","三明")
> Pr1<-c("69","57","67","65","72","55")
> Pr2<-c("180","155","159","184","167","175")
> Pr3<-c("11","14","34","23","35","12")
> Pr4<-c("6","7","5","8","6","9")
> Pr5<-c("20","34","35","56","47","19")
> S1<-c(88,78,NA,56,45,60)
> S2<-c(67,87,45,25,NA,96)
> mydata<-data.frame(PatientID,Data,Age,Gender,City,Pr1,Pr2,Pr3,Pr4,Pr5,S1,S2)
> mydata
  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2
1         1 03/20/20  18      M 福州  69 180  11   6  20 88 67
2         2 03/21/20  25      F 厦门  57 155  14   7  34 78 87
3         3 03/22/20  26      F 泉州  67 159  34   5  35 NA 45
4         4 03/23/20  35      M 龙岩  65 184  23   8  56 56 25
5         5 03/24/20  48      F 漳州  72 167  35   6  47 45 NA
6         6 03/25/20  50      M 三明  55 175  12   9  19 60 96

#比如从mydata数据框中选择Pr1-5成为新的数据集

方法1

代码语言:javascript
复制
> newdata1<-mydata[,c(6:10)]#其中的“,”表示默认选择所有行
> newdata1
  Pr1 Pr2 Pr3 Pr4 Pr5
1  69 180  11   6  20
2  57 155  14   7  34
3  67 159  34   5  35
4  65 184  23   8  56
5  72 167  35   6  47
6  55 175  12   9  19

方法2

代码语言:javascript
复制
> newdata3<-paste("Pr",1:5,sep="")
> newdata3<-mydata[newdata3]
> newdata3
  Pr1 Pr2 Pr3 Pr4 Pr5
1  69 180  11   6  20
2  57 155  14   7  34
3  67 159  34   5  35
4  65 184  23   8  56
5  72 167  35   6  47
6  55 175  12   9  19

方法3

代码语言:javascript
复制
> newdata2<-c("Pr1","Pr2","Pr3","Pr4","Pr5")
> newdata2<-mydata[newdata2]
> newdata2
  Pr1 Pr2 Pr3 Pr4 Pr5
1  69 180  11   6  20
2  57 155  14   7  34
3  67 159  34   5  35
4  65 184  23   8  56
5  72 167  35   6  47
6  55 175  12   9  19

02

删除变量

#若某个变量出现缺失值,在进一步分析之前可能需要丢掉,以下集中方法可用上

方法1

代码语言:javascript
复制
> newdata4<-names(mydata)%in%c("Pr2","Pr4")#返回的是一个逻辑型向量,匹配"Pr2"和"Pr4"元素的值为TRUE,反之为FALSE
> newdata5<-mydata[!newdata4]#mydata[!newdata4]选择逻辑词为TRUE的列,“Pr2”与“Pr4”所在的FLASE的列被剔除。
> newdata5
  PatientID     Data Age Gender City Pr1 Pr3 Pr5 S1 S2
1         1 03/20/20  18      M 福州  69  11  20 88 67
2         2 03/21/20  25      F 厦门  57  14  34 78 87
3         3 03/22/20  26      F 泉州  67  34  35 NA 45
4         4 03/23/20  35      M 龙岩  65  23  56 56 25
5         5 03/24/20  48      F 漳州  72  35  47 45 NA
6         6 03/25/20  50      M 三明  55  12  19 60 96

#分解方法1步骤加强理解

代码语言:javascript
复制
> names(mydata)#生成一个包含变量名的字符型向量
 [1] "PatientID" "Data"      "Age"       "Gender"    "City"      "Pr1"       "Pr2"      
 [8] "Pr3"       "Pr4"       "Pr5"       "S1"        "S2"       
> newdata4
 [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE
> !newdata4#这是将逻辑词进行反转,将TRUE转为FALSE,将FALSE转为TRUE
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE

方法2

在知道Pr2和Pr4在第7个和第9个变量的情况下,可以使用以下语言删除:

代码语言:javascript
复制
> newdata6<-mydata[c(-7,-9)]
> newdata6
  PatientID     Data Age Gender City Pr1 Pr3 Pr5 S1 S2
1         1 03/20/20  18      M 福州  69  11  20 88 67
2         2 03/21/20  25      F 厦门  57  14  34 78 87
3         3 03/22/20  26      F 泉州  67  34  35 NA 45
4         4 03/23/20  35      M 龙岩  65  23  56 56 25
5         5 03/24/20  48      F 漳州  72  35  47 45 NA
6         6 03/25/20  50      M 三明  55  12  19 60 96

方法3

代码语言:javascript
复制
> mydata$Pr2<-mydata$Pr4<-NULL
> mydata
  PatientID     Data Age Gender City Pr1 Pr3 Pr5 S1 S2
1         1 03/20/20  18      M 福州  69  11  20 88 67
2         2 03/21/20  25      F 厦门  57  14  34 78 87
3         3 03/22/20  26      F 泉州  67  34  35 NA 45
4         4 03/23/20  35      M 龙岩  65  23  56 56 25
5         5 03/24/20  48      F 漳州  72  35  47 45 NA
6         6 03/25/20  50      M 三明  55  12  19 60 96

03

subset()函数

subset函数可能是选择变量和观测最简单的方法了。

方法1

#选择mydata中的Age大于等于30或Age小于等于25的行,保留变量Pr1到Pr5。

代码语言:javascript
复制
> newdata9<-subset(mydata,Age>=35|Age<25,aelect=c(Pr1,Pr2,Pr3,Pr4,Pr5))
> newdata9
  PatientID     Data Age Gender City Pr1 Pr3 Pr5 S1 S2
1         1 03/20/20  18      M 福州  69  11  20 88 67
4         4 03/23/20  35      M 龙岩  65  23  56 56 25
5         5 03/24/20  48      F 漳州  72  35  47 45 NA
6         6 03/25/20  50      M 三明  55  12  19 60 96

方法2

#选60岁以上的男性,并保留变量Age到S1之间所有的列。

代码语言:javascript
复制
> newdata10<-subset(mydata,Gender=="M"&Age>25,select=Gender:S1)
> newdata10
  Gender City Pr1 Pr3 Pr5 S1
4      M 龙岩  65  23  56 56
6      M 三明  55  12  19 60

04

SQL语句

之前学过SQL结构化查询语句的人,如果能够将R语言中的sqldf包利用起来实为一件美事。

#安装和加载包

代码语言:javascript
复制
>install.packages("sqldf")
>library(sqldf)

#构建数据

代码语言:javascript
复制
> PatientID<-c(1,2,3,4,5,6)
> Data<-c("03/20/20","03/21/20","03/22/20","03/23/20","03/24/20","03/25/20")
> Age<-c(18,50,26,25,48,35)
> Gender<-c(1,2,1,2,1,2)
> City<-c("福州","厦门","泉州","龙岩","漳州","三明")
> Pr1<-c("69","57","67","65","72","55")
> Pr2<-c("180","155","159","184","167","175")
> Pr3<-c("11","14","34","23","35","12")
> Pr4<-c("6","7","5","8","6","9")
> Pr5<-c("20","34","35","56","47","19")
> S1<-c(88,78,56,56,45,60)
> S2<-c(67,87,45,25,45,96)
> mydata1<-data.frame(PatientID,Data,Age,Gender,City,Pr1,Pr2,Pr3,Pr4,Pr5,S1,S2)
> mydata1
  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2
1         1 03/20/20  18      1 福州  69 180  11   6  20 88 67
2         2 03/21/20  50      2 厦门  57 155  14   7  34 78 87
3         3 03/22/20  26      1 泉州  67 159  34   5  35 56 45
4         4 03/23/20  25      2 龙岩  65 184  23   8  56 56 25
5         5 03/24/20  48      1 漳州  72 167  35   6  47 45 45
6         6 03/25/20  35      2 三明  55 175  12   9  19 60 96
代码语言:javascript
复制
>sqldf("select avg(Age) as avg_Age,avg(S1) as avg_S1,City from mydata1 where Gender in (1,2) group by City",row.names=TRUE)#这是指输出mydata1数据框中的性别为男和女的所在城市的年龄Age和S1的均值。
 >avg_Age avg_S1 City
1      35     60 三明
2      50     78 厦门
3      26     56 泉州
4      48     45 漳州
5      18     88 福州
6      25     56 龙岩
代码语言:javascript
复制
> newdata11<-sqldf("select*from mydata1 where Gender order by Age",row.names=TRUE)#是指从mydata1数据框中选择所有变量所在(列),保留Gender所在的行,按照Age进行升序排列,row.names=TRUE将原始数据框中的行名延续到了新数据框newdata1中。
> newdata11

  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2
1         1 03/20/20  18      1 福州  69 180  11   6  20 88 67
4         4 03/23/20  25      2 龙岩  65 184  23   8  56 56 25
3         3 03/22/20  26      1 泉州  67 159  34   5  35 56 45
6         6 03/25/20  35      2 三明  55 175  12   9  19 60 96
5         5 03/24/20  48      1 漳州  72 167  35   6  47 45 45
2         2 03/21/20  50      2 厦门  57 155  14   7  34 78 87

小结

R语言最大的优势是绘图,学R的初心就是为了绘制实验过程产生的数据图,然而随着深度学习,会发现,R语言的数据分析也很重要,常常会在绘制图形的过程中,因为数据框中存在格式不统一,字符或者缺失值等原因导致绘图失败。对于非数学专业又喜欢R语言的人来说,学R之路漫漫其修远,没有极客基因是不行的,打好基础是进阶的前提!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 菜鸟学数据分析之R语言 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档