任何人都可以解释这行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,]
答案 0 :(得分:1)
complete.cases
函数将检查数据框,并返回TRUE
和FALSE
的向量,其中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,]
解析为:
t[exists,][1:6,]
t
的{{1}}元素对应的行。TRUE
中包含行号的行,即第1行到第6行更复杂的答案是解析器将其处理为:
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
错误。