美文网首页数据、字符R处理
R中5种取子集的方法,你zao吗?

R中5种取子集的方法,你zao吗?

作者: Dayueban | 来源:发表于2020-03-29 17:44 被阅读0次

编译:Dayueban
责编:王采荷

写在前面

当我们需要对一个表格进行有目的性的索取的时候,比如我想抽取出我想要的行或者是列,那么这个时候你会采用哪些方法呢?个人认为,以下几种都是可以的。

第一种: example[x,y]

这一种也是我们平时,或者对于我们初学者来说用的最多的一种方法了。

  • 首先抓取一个数据框来作为示例数据
### import education expenditure data set and assign column names
education <-read.csv("https://vincentarelbundock.github.io/Rdatasets/csv/robustbase/education.csv)", stringsAsFactors =FALSE)
colnames(education) <- c("X","State","Region","Urban.Population","Per.Capita.Income","Minor.Population","Education.Expenditures")
View(education)
图一 数据集概览
dim(education)
# [1] 50  7
# 可以看到数据集有50行,7列

数据集不算大,所以我们可以采用中括号的方式,直接选择你想要保留的行和列,比如我想保留region=2的行,然后与其对应的Minor.PopulationEducation.Expenditures,那我我就可以这样:

# 为我们所取子集取个名称:ed_exp1
ed_exp1 <- education[c(10:21),c(2,6:7)]
View(ed_exp1)

第二种:example[-x,-y]

除了直接选择我们所需要的列和行,那么反过来,我们把不需要保留的行和列减去就可以了,这里用到一个负号“-”

ed_exp2 <- education[-c(1:9,22:50),-c(1,3:5)]
图二 所构建的ed_exp1和ed_exp2数据子集

!!!敲黑板
需要注意的是,如果数据集比较小,采用上述两种方法还可以,但是如果是长百上千行和列,如果用这样的方法去取子集的话则会事倍功半,那么接下来我们可能需要更加便捷和高效的方法:

第三种:还是用中括号,但是我们加入了一些函数

ed_exp3 <- education[which(education$Region == 2),names(education) %in% c("State","Minor.Population","Education.Expenditures")]
  • 我们看到这里和前面两种方法大致是一样的,都采用的是中括号,但是这里采用了which%in%两个函数来判断,也就是说如果我们提前知道我们需要选取的行和列的信息,那么在更大的数据集当中,我们只需要把符合我们预期的行和列用这两个函数进行选取就可以了
  • 其中which表示把education数据集中Region等于2的行给予保留
  • 而names(education) %in% c("State","Minor.Population","Education.Expenditures")这里表示列名中符合"State","Minor.Population","Education.Expenditures"的保留,%in%相当于一种取交集的意思。

第四种:采用subset函数

ed_exp4 <- subset(education, Region == 2, select = c("State","Minor.Population","Education.Expenditures"))

当然,有些人肯定会觉得第三种方法写的代码也太长了,要那么多字,未免复杂了写。

那么这里的subset函数是什么意思呢,首先subset函数包括三个选项:subset(x, subset, select, ...),其中x表示原始数据集,第二个参数表示截取满足你要求的行,第三个参数表示你要保留的列,怎么样,是不是更简单一些,操作性更强呢?

图三 子集ed_exp3和ed_exp4

第五种:dplyr包

前面四种都是基于基础R语言环境就可以执行的,这里介绍的第五种方法涉及R语言包dplyr,需要安装该包之后才能运行相关的函数

# 安装dplyr包
install.packages("dplyr")
library(dplyr)
ed_exp5 <- select(filter(education, Region == 2),c(State,Minor.Population:Education.Expenditures))
  • filter函数:第一个参数就是原始数据框,如education,第二个参数就是我们想去自己的条件,该函数的结果是获得整个数据集并且只保留我们想要的行。
  • select函数:在filter函数结果下进一步操作,列出我们需要保留的列名就可以,不用像前面几种方法又要写出等号啦,又要用names()函数获得全部列名啦。总的来说更加简便。


    图四 子集ed_exp5

小结

总的来说,物种方法各有特点,无论哪种,有助于你的数据取子集和快速的数据分析即可。

参考:

https://www.r-bloggers.com/5-ways-to-subset-a-data-frame-in-r/

相关文章

网友评论

    本文标题:R中5种取子集的方法,你zao吗?

    本文链接:https://www.haomeiwen.com/subject/kwduuhtx.html