在dplyr tbl_df中获取已删除列的最佳做法

时间:2015-06-11 13:34:53

标签: r dataframe dplyr

我记得2001年对r-help的评论说drop = TRUE [.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]])

1 个答案:

答案 0 :(得分:7)

您可以使用[[提取功能代替[

d1[[1]]
## [1] 1 2 3 4 5

如果你在dplyr中使用了大量的管道,你可能还想使用extract包中的便捷功能extract2magrittr

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