首页 > > > R语言笔记3:提取R对象的子集
作者:圈圈,R语言中文社区专栏作者
来源公众号:宏基因组

Subsetting R Objects
取子集的三种基本方法
(一)向量取子集
举例
> x <- c("a", "b", "c", "c", "d", "a") > x[2] ## 提取第二个元素 [1] "b" > x[1:4] ## 提取连续多个元素 [1] "a" "b" "c" "c" > x[c(1, 3, 4)] ## 提取不连续的多个元素 [1] "a" "c" "c"
2.单括号+逻辑索引(按字母排序):
> x <- c("a", "b", "c", "c", "d", "a") > x[x > "a"] ## 提取首字母排序大于a的元素[1] "b" "c" "c" "d"
3.创建逻辑向量
> u <- x > "a"> u[1] FALSE TRUE TRUE TRUE TRUE FALSE> x[u][1] "b" "c" "c" "d"
(二)矩阵取子集
矩阵取子集可通过行索引和列索引来完成。
例如以下2*3的矩阵
> x <- matrix(1:6, 2, 3)> x [,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6> x[1, 2] [1] 3> x[, 1][1] 1 2> x[1, 2, drop = FALSE] ## 修改drop参数,返回矩阵形式 [,1][1,] 3> x[, 1, drop = FALSE] [,1][1,] 1[2,] 2
(三)列表取子集
列表取子集既可以使用“[”,"[[",也可以使用“$”
> ## 创建一个含有两个元素的列表> x <- list(foo = 1:4, bar = 0.6)> x$foo[1] 1 2 3 4$bar[1] 0.6> ## 三种方法提取第一个元素> x[1] ## 单方括号返回的也是一个列表$foo[1] 1 2 3 4> x[[1]][1] 1 2 3 4> x$foo[1] 1 2 3 4
列表取子集方法的好处是不需要记住顺序,只要有名字就可以。
但是如果要从列表中提取多个元素,只能使用单方括号(双方括号和美元符号只能提取单个元素),并且知道顺序。
> x <- list(foo = 1:4, bar = 0.6, baz = "hello")> x[c(1, 3)]$foo[1] 1 2 3 4$baz[1] "hello"
双方括号和美元符号的区别:
美元符号必须是列表中存在的元素名;
双方括号可以是后续再次赋值变量之后的
> x <- list(foo = 1:4, bar = 0.6, baz = "hello")> name <- "foo">> ## computed index for "foo"> x[[name]] [1] 1 2 3 4>> ## element "name" doesn’t exist! (but no error here)> x$name NULL>> ## element "foo" does exist> x$foo [1] 1 2 3 4
另外双方括号可以取一个整数数列,不仅仅是一个数字
> x <- list(a = list(10, 12, 14), b = c(3.14, 2.81))> > ## Get the 3rd element of the 1st element> x[[c(1, 3)]] [1] 14> > ## Same as above> x[[1]][[3]] [1] 14> > ## 1st element of the 2nd element> x[[c(2, 1)]] [1] 3.14
(四)模糊匹配
美元符号$和双方括号[[有模糊匹配的功能。可以通过这种方法在命令行快速查找元素。
例:
> x <- list(aardvark = 1:5)> x$a[1] 1 2 3 4 5> x[["a"]] ## 参数默认为精确匹配NULL> x[["a", exact = FALSE]] ## 参数设置为不精确匹配[1] 1 2 3 4 5
(五)删除缺失数据和缺失值(NA)
大部分真实数据中包含大量缺失数据,不管是向量、矩阵还是数据框,通过创建一个能够告诉你哪里有缺失值的逻辑向量,从而创建子集来删除它们is.na() 函数可以找到某个向量中的缺失值,例:
> x <- c(1, 2, NA, 4, NA, 5)> bad <- is.na(x)> print(bad)[1] FALSE FALSE TRUE FALSE TRUE FALSE> x[!bad] ## !bad表示非缺失值[1] 1 2 4 5
如果有多个向量、多个对象,NA分布在各个不同地方,目的是去除所有缺失值建立新的子集,可以使用 complete.cases() 函数,如下例:
> x <- c(1, 2, NA, 4, NA, 5)> y <- c("a", "b", NA, "d", NA, "f")> good <- complete.cases(x, y)> good[1] TRUE TRUE FALSE TRUE FALSE TRUE> x[good][1] 1 2 4 5> y[good][1] "a" "b" "d" "f"
类似地,如果x,y两个向量的缺失值位置不同, complete.cases() 函数则取并集判断缺失位置:
> x <- c(1, 2, NA, 4, NA, 5)> y <- c("a", "b", NA, NA, "d", "f")> good <- complete.cases(x, y)> good[1] TRUE TRUE FALSE FALSE FALSE TRUE> > x[good][1] 1 2 5> y[good][1] "a" "b" "f"complete.cases() 函数也可以用于从数据框中移除缺失值
> ## 创建数据框airquality> Ozone <- c(41, 36, 12, 18, NA, 28, 13, 15)> Solar.R <- c(190, 118, 149, 313, NA, NA, 244, 222)> Wind <- c (7.4, 8.0, 12.1, 11.2, 14.3, 13.9, 14.1, 15.2)> Temp <- c(67, 72, 74, 62, 56, 66, 22, 33)> Month <- c(5, 5, 5, 5, 5, 5, 5, 5)> Day <- c(1, 2, 3, 4, 5, 6, 7, 8)> airquality <- data.frame(Ozone, Solar.R, Wind, Temp, Month, Day)> airqualityOzone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.1 74 5 34 18 313 11.2 62 5 45 NA NA 14.3 56 5 56 28 NA 13.9 66 5 67 13 244 14.1 22 5 78 15 222 15.2 33 5 8>> ## 取数据框中的前六行数据> head(airquality)Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 18 313 11.5 62 5 45 NA NA 14.3 56 5 56 28 NA 14.9 66 5 6>> ## 通过创建逻辑向量找到没有缺失数据的行> good <- complete.cases(airquality)> head(airquality[good, ])Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.6 74 5 34 18 313 11.5 62 5 47 23 299 8.6 65 5 78 19 99 13.8 59 5 8
(六)提取某种条件下数据框的子集
如上例:
挑取Ozone列中数值大于18,且Temp数值大于60的数据子集,从该子集中计算Wind数据的平均值
> Ozone <- c(41, 36, 12, 18, NA, 28, 13, 15)> Solar.R <- c(190, 118, 149, 313, NA, NA, 244, 222)> Wind <- c (7.4, 8.0, 12.1, 11.2, 14.3, 13.9, 14.1, 15.2)> Temp <- c(67, 72, 74, 62, 56, 66, 22, 33)> Month <- c(5, 5, 5, 5, 5, 5, 5, 5)> Day <- c(1, 2, 3, 4, 5, 6, 7, 8)> data <- data.frame(Ozone, Solar.R, Wind, Temp, Month, Day)> dataOzone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 23 12 149 12.1 74 5 34 18 313 11.2 62 5 45 NA NA 14.3 56 5 56 28 NA 13.9 66 5 67 13 244 14.1 22 5 78 15 222 15.2 33 5 8> > ## 设置条件> d2 <- data[data$Ozone>18 & data$Temp>60, ]> d2Ozone Solar.R Wind Temp Month Day1 41 190 7.4 67 5 12 36 118 8.0 72 5 26 28 NA 13.9 66 5 6> m <- d2$Wind> m[1] 7.4 8.0 13.9> mean(m)[1] 9.766667
参考资料:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3119587/ ,如需转载,请注明出处,否则将追究法律责任。