例如,使用数据集 mtcars
mtcars[ , "cyl"]
Run Code Online (Sandbox Code Playgroud)
和
mtcars[ , 2]
Run Code Online (Sandbox Code Playgroud)
两个都给我相同的专栏.所以,既然我可以得到一切,但第2列是这样的:
mtcars[ , -2]
Run Code Online (Sandbox Code Playgroud)
我不指望这个:
mtcars[ , -"cyl"]
Error in -"cyl" : invalid argument to unary operator
Run Code Online (Sandbox Code Playgroud)
相反,我能想到的最好的是:
mtcars[ , !colnames(mtcars)=="cyl"]
Run Code Online (Sandbox Code Playgroud)
有更简单的解决方案吗?
编辑:似乎合乎逻辑的是,如果前两种技术有效,那么后两种技术也应该如此.我希望我遗失了一些东西.帮助页面?"["或?subset不解释这种违反直觉的结果.有谁知道这是为什么?
Rei*_*son 27
[编辑:]解释为什么负字符串索引不起作用:
-()是一个函数,R开发人员说它不能用在字符向量上(而不仅仅是因为否定字符串没有意义).因为您无法否定字符向量,所以无法为删除列提供负字符串.问题在于,-并且是您引用的错误消息的来源.因此,负指数仅适用于数字的规则.原始错误的来源是:
> -"cyl"
Error in -"cyl" : invalid argument to unary operator
Run Code Online (Sandbox Code Playgroud)
请注意,在对Q的评论中,存在混淆,即负面版本"cyl"是"-cyl",它不是,它只是另一个字符串.上面的R片段显示了问题中尝试的子集化中发生的情况.
[原始:]
删除组件的最简单方法就是将该组件设置为NULL:
> cars <- mtcars
> cars[, "cyl"] <- NULL ## or cars$cyl <- NULL
> names(cars)
[1] "mpg" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
Run Code Online (Sandbox Code Playgroud)
[编辑:] 根据编辑到Q表示需要暂时删除指定列,然后:
subset(mtcars, select = -cyl)
Run Code Online (Sandbox Code Playgroud)
要么
mtcars[, !names(mtcars) %in% "cyl"]
Run Code Online (Sandbox Code Playgroud)
是选择,前者比后者更清洁.
小智 12
我经常使用subset.一个使用的例子mtcars
> names(mtcars)
[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
> cars <- subset(mtcars, select=-c(mpg,cyl))
> names(cars)
[1] "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
Run Code Online (Sandbox Code Playgroud)
在这个问题的答案中还有一些其他的想法.
更新:子集也适用于按名称临时删除一个或多个列,只需替换mtcars[,-2]为subset(mtcars, select=-cyl).
| 归档时间: |
|
| 查看次数: |
9601 次 |
| 最近记录: |