“的不同表达方式中的一种方式”;子集();函数在R中失败
我在“的不同表达方式中的一种方式”;子集();函数在R中失败,r,R,我在subset()的帮助文件中发现,“选择”或“反向选择”的语法不同。具体来说,在“选择”示例中,列的名称由c()包围,但在“反向选择”中,没有c()。此外,它们都没有定量标记。所以我尝试了一些不同的语法: ## For `selection` # standard usage in Help subset(airquality, select = c(Temp)) # some different syntax # (1a) add quotation mark: worked subs
subset()
的帮助文件中发现,“选择”或“反向选择”的语法不同。具体来说,在“选择”示例中,列的名称由c()
包围,但在“反向选择”中,没有c()
。此外,它们都没有定量标记。所以我尝试了一些不同的语法:
## For `selection`
# standard usage in Help
subset(airquality, select = c(Temp))
# some different syntax
# (1a) add quotation mark: worked
subset(airquality, select = c("Temp"))
# (2a) remove "c()": worked
subset(airquality, select = Temp)
## For `inverse selection`
# standard usage in Help
subset(airquality, select = -Temp)
# some different syntax
# (1b) add "c()": worked
subset(airquality, select = -c(Temp))
# (2b) add quotation mark: failed
# Error in -c("Temp") : invalid argument to unary operator
subset(airquality, select = -c("Temp"))
除了最后一个例子,这些非标准用法都有效。最后一个示例生成了一个错误:error in-c(“Temp”):一元运算符的参数无效
我有两个问题:
(1) 为什么会发生这种错误?因为在(1a)
和(2b)
中,这两种非标准用法似乎相同,但(1a)
成功,而(2b)
失败
(2) 有人能告诉我什么时候应该在
c()
中使用c()
,或者“
?所以我深入研究了子集的源函数:
subset <- function(df, vars) {
vars <- substitute(vars)
var_pos <- setNames(as.list(seq_along(df)), names(df))
pos <- eval(vars, var_pos)
df[, pos, drop = FALSE]
}
由于没有在的“Temp”
上应用任何操作,因此该操作的评估结果很好。但是,如果我们尝试输入-“Temp”
,我们会得到以下结果:
vars <- substitute(-"Temp")
> vars
-"Temp"
var_pos <- setNames(as.list(seq_along(airquality)), names(airquality))
> var_pos
$Ozone
[1] 1
$Solar.R
[1] 2
$Wind
[1] 3
$Temp
[1] 4
$Month
[1] 5
$Day
[1] 6
pos <- eval(vars, var_pos)
这里我们有pos
,它是-4
,所以我们可以从数据框中删除第四列
df <- airquality[, pos, drop = FALSE]
> head(df)
Ozone Solar.R Wind Month Day
1 41 190 7.4 5 1
2 36 118 8.0 5 2
3 12 149 12.6 5 3
4 18 313 11.5 5 4
5 NA NA 14.3 5 5
6 28 NA 14.9 5 6
df头(df)
臭氧太阳.R风月日
1 41 190 7.4 5 1
2 36 118 8.0 5 2
3 12 149 12.6 5 3
4 18 313 11.5 5 4
5 NA NA 14.3 5 5
628NA 14.956
vars <- substitute(-Temp)
> vars
-Temp
var_pos <- setNames(as.list(seq_along(airquality)), names(airquality))
pos <- eval(vars, var_pos)
> pos
[1] -4
df <- airquality[, pos, drop = FALSE]
> head(df)
Ozone Solar.R Wind Month Day
1 41 190 7.4 5 1
2 36 118 8.0 5 2
3 12 149 12.6 5 3
4 18 313 11.5 5 4
5 NA NA 14.3 5 5
6 28 NA 14.9 5 6