我有一个大型数据集,我想阅读特定列或删除所有其他列 .
data <- read.dta("file.dta")
我选择了我不感兴趣的列:
var.out <- names(data)[!names(data) %in% c("iden", "name", "x_serv", "m_serv")]
而且我想做的事情如下:
for(i in 1:length(var.out)) {
paste("data$", var.out[i], sep="") <- NULL
}
删除所有不需要的列 . 这是最佳解决方案吗?
10 回答
不要使用
-which()
,这是非常危险的 . 考虑:而是使用子集或
!
函数:我从痛苦的经历中学到了这一点 . 不要过度使用
which()
!您也可以尝试
dplyr
包:这是一个快速的解决方案 . 比如,你有一个数据框X,有三列A,B和C:
如果我想删除一个列,比如B,只需在colnames上使用grep来获取列索引,然后可以使用该索引来省略该列 .
您的新X数据框将如下所示(此时没有B列):
grep的美妙之处在于您可以指定与正则表达式匹配的多个列 . 如果我有五列X(A,B,C,D,E):
取出B栏和D栏:
编辑:考虑Matthew Lundberg在下面的评论中的grepl建议:
如果我尝试删除一个不存在的列,则不会发生任何事情:
我将代码更改为:
无论如何,朱巴的答案是我的问题的最佳解决方案!
您应该使用索引或
subset
函数 . 例如 :然后,您可以在列索引中使用
which
函数和-
运算符:或者,更简单的是,使用
subset
函数的select
参数:然后可以直接在列名矢量上使用-
运算符,甚至可以省略名称周围的引号!请注意,您还可以选择所需的列,而不是删除其他列:
由于声誉得分低,我无法在评论中回答您的问题 .
下一个代码会给你一个错误,因为paste函数返回一个字符串
这是一个可能的解决方案:
或者只是做:
First ,如果使用相同的数据帧,可以使用直接索引(使用布尔值向量)而不是重新访问列名;如Ista所指出的那样更安全,写入和执行速度更快 . 所以你只需要:
然后,只需重新分配数据:
Second ,写入速度更快,可以直接为要删除的列分配NULL:
Finally ,您可以使用subset(),但它不能真正用在代码中(甚至帮助文件也会对其进行警告) . 具体来说,问题是如果你想直接使用susbset()的drop特性,你需要在没有引号的情况下编写与列名对应的表达式:
As a bonus ,这里是不同选项的小基准,清楚地表明子集较慢,而第一个重新分配方法更快:
Code 如下:
我试图在使用包
data.table
时删除一列,并得到了意想不到的结果 . 我认为以下可能值得发布 . 只是一点警示 .[马修编辑......]
基本上,
data.table
的语法与data.frame
不完全相同 . 实际上存在很多差异,请参阅FAQ 1.1和FAQ 2.17 . 你被警告了!这是另一种可能对其他人有帮助的解决方案 . 下面的代码从大型数据集中选择少量行和列 . 除了我使用粘贴函数选择一组名称按顺序编号的列之外,这些列在juba的答案中被选中: