在 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 包中的便捷函数 extractextract2

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 中删除列的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

打印包含 S4 对象列表列的 data.frame

在 dplyr 中过滤日期

R语言使用dplyr将特定的数据列移动到最前面使用dplyr将特定数据列移动到另一指定数据列的后面使用dplyr将特定数据列移动到另一指定数据列的前面

在 dplyr 中计算、收集和折叠做啥?

在 Python/PySpark 中 Spark 复制数据框列的最佳实践?

使用 dplyr 对多个变量的所有可能组合进行分组