子集化的解释

时间:2014-10-10 17:00:19

标签: r

任何人都可以解释这行t[exists,][1:6,]在下面的代码中做了什么,以及该子集的工作原理是什么?

t<-trees
t[1,1]= NA
t[5,3]= NA
t[1:6,]
exists<-complete.cases(t)
exists
t[exists,][1:6,]

2 个答案:

答案 0 :(得分:1)

complete.cases函数将检查数据框,并返回TRUEFALSE的向量,其中TRUE表示没有丢失数据的行。只要t中有行,<。

就会有向量

t[exits,]部分会对数据进行分组,以便只考虑exists为真的行 - 缺少数据的行在FALSE中为exists且除去。 [1:6,]只会占用没有丢失数据的前6行。

答案 1 :(得分:1)

一些背景

在R中,[是一个与其他任何函数一样的函数。 R将t[exists, ]解析为

`[`(t, exists)  # don't forget the backticks!

实际上,您总是可以使用反引号和括号语法调用[,或者甚至更疯狂地在

等结构中使用它
as.data.frame(lapply(t[exists, ], `[`, 1:6, ))
无论信不信,

(几乎)相当于t[exists,][1:6,]

[[$等函数以及names<-之类的奇特内容也是如此,这是一个将参数value赋给{{}的特殊函数。 1}}对象的属性。我们一直使用这样的函数,语法如

names

没有意识到我们真正做的是

names(iris) <- tolower(names(iris))

最后,您可以输入

`names(iris)<-`(iris, tolower(names(iris))

用于文档,或键入

?`[`

返回定义,就像任何其他函数一样。

`[` 做什么

简单的答案是R将t[exists,][1:6,]解析为:

  1. 获取t[exists,][1:6,]
  2. 的值
  3. 从第1步的结果中,获取与t的{​​{1}}元素对应的行。
  4. 从第2步的结果中,获取向量TRUE中包含行号的行,即第1行到第6行
  5. 更复杂的答案是解析器将其处理为:

    exists

    人类可以解释为

    1:6

    有趣的是,由于您通常无法在R中传递空白参数,因此使用括号函数无法进行某些构造,例如`[`(`[`(t, exists, ), 1:6, ) # yes, this has blank arguments 会导致temporary_variable_1 <- `[`(t, exists, ) temporary_variable_2 <- `[`(temporary_variable_1, 1:6, ) print(temporary_variable_2) # implicitly, sending an object by itself to the console will `print` that object 错误。