在 dplyr tbl_df 中删除列的最佳实践
Posted
技术标签:
【中文标题】在 dplyr tbl_df 中删除列的最佳实践【英文标题】:Best practice to get a dropped column in dplyr tbl_df 【发布时间】:2015-08-27 05:46:53 【问题描述】:我记得 2001 年关于 r-help 的评论说 drop = TRUE
in [.data.frame
是 R 历史上最糟糕的设计决策。
dplyr
更正了这一点并且不会隐式删除。当尝试将旧代码转换为dplyr
样式时,当d[, 1]
或d[1]
被假定为向量时,这会引入一些讨厌的错误。
我当前的解决方法如下所示使用unlist
来获取1 列向量。有更好的想法吗?
library(dplyr)
d2 = data.frame(x = 1:5, y = (1:5) ^ 2)
str(d2[,1]) # implicit drop = TRUE
# int [1:5] 1 2 3 4 5
str(d2[,1, drop = FALSE])
# data.frame': 5 obs. of 1 variable:
# $ x: int 1 2 3 4 5
# With dplyr functions
d1 = data_frame(x = 1:5, y = x ^ 2)
str(d1[,1])
# Classes ‘tbl_df’ and 'data.frame': 5 obs. of 1 variable:
# $ x: int 1 2 3 4 5
str(unlist(d1[,1]))
# This ugly construct gives the same as str(d2[,1])
str(d1[,1][[1]])
【问题讨论】:
为什么不直接使用d1[[1]]
也可以。在 [[]] 空间中迷路了。请张贴作为答案作为参考。我发布了这个摘要,因为我在 SO 和文档中找不到它。如果有人在 dplyr
文档中发现了警告,请在此处添加链接。
【参考方案1】:
您可以只使用[[
提取函数而不是[
。
d1[[1]]
## [1] 1 2 3 4 5
如果您在 dplyr 中使用大量管道,您可能还想使用 magrittr
包中的便捷函数 extract
和 extract2
:
d1 %>% magrittr::extract(1) %>% str
## Classes ‘tbl_df’ and 'data.frame': 5 obs. of 1 variable:
## $ x: int 1 2 3 4 5
d1 %>% magrittr::extract2(1) %>% str
## int [1:5] 1 2 3 4 5
或者如果extract
对你来说太冗长,你可以直接在管道中使用[
:
d1 %>% `[`(1) %>% str
## Classes ‘tbl_df’ and 'data.frame': 5 obs. of 1 variable:
## $ x: int 1 2 3 4 5
d1 %>% `[[`(1) %>% str
## int [1:5] 1 2 3 4 5
【讨论】:
magrittr::extract(1)
已在另一个 SO 线程中提及。当您需要多列时,它有点冗长且不太方便。
[[
(1):很好的演示,但这也是许多人认为 R 作为只写语言仅次于 Perl 的原因之一。
`[`(1)
和 `[[`(1)
来自哪里,即我在哪里可以找到有关这方面的一些文档?当我想使用extract2时,为什么必须将命名向量放在引号中,即`extract2(“x”)
@dapperdan:它们是 data.frames 的常规提取函数。您可以像往常一样使用 ?`[` 或 ?`[[` 获得帮助,或者更好地使用 ?`[.data.frame` 获得特定于 data.frame 的帮助。
谢谢,这个回复比我摸索我的评论格式要快。我对提取函数有点熟悉,例如 df["x"] 和 df[["x"]],(或者更确切地说,我只是在 Hadley 的世界中学习这个)。我在文档中找不到的是 [[
(1) 与 [[1]] 的使用。 IE。为什么不能在管道中使用后者而不是前者,例如以上是关于在 dplyr tbl_df 中删除列的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用dplyr将特定的数据列移动到最前面使用dplyr将特定数据列移动到另一指定数据列的后面使用dplyr将特定数据列移动到另一指定数据列的前面