R语言练习2.0之四种方法获取行和列

2021.9.22
中秋节后新的练习开始啦~练习用的是“nycflights13”的数据。

install.packages("nycflights13")
library(nycflights13)
nycflights13::flights
View(flights)
f<-flights
class(f)
f$r<-f$year*2   #翻译:新加一列(列名为r),且第20列r中的值都是第1列year中值的2倍
colnames(f)
f$r

目标:学习数据选取的三种思维模式

【一】通过位置获取

## 获取第一行
h1<-f[1,]
l2<-f[,2]
class(l2)          #l2是从f中取(带有行)的第2列,所以class后是table
# 获取第1列
## 使用$获取列
l3<-f$day
class(l3)          #l3是从f中把第3列的值取出,所以class后是integer(n.整数)
# 选取第2到4行
h234<-f[2:4,]
# 选取第2到4列
l234<-f[,2:4]
# 选取第2到4行,3到5列
h234l345<-f[2:4,3:5]

【二】通过行名和列名获取

## 其中行名获取的方法十分推荐
## 但是记住一点, 行名不能重复
row<-rownames(flights)    # 返回行名
col<-colnames(flights)    # 返回列名
## 用名称提取行
ROW235<-c(2,3,5)          #如果行名是字符串,也可以写成(例如)ROWX<-c("chr1","chr2",...,"chrn")
row235<-f[ROW235,]        #rowx<-f[ROWX,]即可根据名称提取行。
                          #下次试试rowx<-f[c("chr1","chr2",...,"chrn"),]
## 用名称提取列
View(col)
col235<-f[,c("month","day","sched_dep_time")]
## 用名称同时提取行和列
rc<-f[ROW235,c("month","day","sched_dep_time")]
rc

2021.9.23
【三】通过逻辑获取

## 逻辑获取,先产生逻辑,再返回位置,再获取
##先产生逻辑
L<-f$month == "2"    #方法1,用【==""】赋予逻辑
filter(f,month==2|month==12)   #方法2,用filter()获取行,详见《R数据科学》第三章
table(f$month == "2")
table(f$month)
##再返回位置,再获取
which(f$month == "2")  #获得符合逻辑的行所对应的位置
h<-f[c(111297:136247),]   #返回位置获取行
h<-f[f$month == "2",]     #一步到位的缩减版
## 在此基础上可以再选择列
hl<-f[f$month == "2",c(2,3,5)]
## 难点在于产生正确的逻辑值
## 有多少种方法可以产生逻辑值??
## 1.最重要的逻辑判断,如比较大小
f$dep_time>600       #还可以用【>,<加数】赋予逻辑,数的两旁不需要带"",记不住使用方法可以Being一下~
table(f$dep_time)
## 2.函数产生,比如grepl,%in%
filter(f,month==2|month==12)     #用%in%简写见下一行
feb_dec<-filter(f,month%in%c(2,12))
JFK<-filter(f,origin%in%c("JFK"))
#关于grepl:R语言中的grepl()函数用于在向量中找到指定模式时返回值True,如果未找到则返回false。
#用法: grepl(pattern, string, ignore.case=FALSE)
#参数:pattern:正则表达式模式
#参数:string:要搜索的字符向量
#参数:ignore.case:是否在搜索中忽略大小写。这里 ignore.case 是一个可选参数,默认设置为 FALSE。
LGA<-f[grepl("LGA",f$origin),]

注意:难点在于产生正确的逻辑值

【四】行列的选择,还有一个重要的函数subset

## subset,第一个数据DataFrame,第二个选行(逻辑值),第三个是列,名称
J<-f$origin=="JFK"
mydata2<-subset(f,f$origin=="JFK",select=c("origin","dest","distance"))
mydata3<-subset(f,f$origin=="JFK",select=c(1:10))
## 删除列和增加列
## 删掉第一列
mydata1<-f[,-1]
## 增加一列
mydata1$new<-LETTERS[1:336776]
mydata1$new<-c(1:336776)
## 使用位置调整顺序,
## 把最后一列调整到第1列,很常用
mydata2<-mydata1[,c(20,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)]
mydata3<-mydata1[,c(20,seq(1,19))]
mydata4<-mydata1[,c(20,1:19)]
#获取名称
colnames(mydata1)
rownames(mydata1)
## 修改部分名称
colnames(mydata1)[3:5] <- c("dep_time1","sched_dep_time1","dep_delat1")
rownames(mydata1)[1:2] <- c("r1","r2")
###用tidyr包进行长数据和宽数据的相互转换
##pivot_longer,数据变长,增加行
#pivot_longer()使宽数据转换为长数据。
#其简要用法为:pivot_longer(data, cols, names_to = "name", values_to = "value")
#参数:data即为需要进行数据结构转化的数据集。
#参数:cols指定进行转化的列,在select()函数中可以帮助指定列的"select helper"在这里也适用,可以使用负号“-”表示反向选择。
#参数:names_to:col指定的那些列的列名会组成一个新的变量,names_to指定该新变量的变量名。
#参数:values_to:col指定的那些列的变量值会组成一个新的变量,values_to指定该新变量的变量名。
##pivot_wider,数据变宽,增加列(阅读课后材料学习,使用到的数据在data文件夹)
#pivot_wider()使长数据转换为宽数据。
#其简要用法为:pivot_wider(data, id_cols = NULL, names_from = "name",values_from = "value")
#参数:data即为需要进行数据结构转化的数据集。
#参数:id_cols指定用什么变量来识别不同观测。不指定时默认用除names_from和values_from所指定变量之外的所有变量来识别不同观测。
#参数:names_from指定新数据集中展开的各新变量的变量名由旧数据集的哪个(或哪些)变量得到。
#参数:values_from指定新数据集中展开的各新变量的变量值由旧数据的哪个(或哪些)得到。如果指定了多个值,则会求和得到新变量值。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容