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

Die*_*nne 9 r dataframe dplyr

我记得在R-帮助评论在2001年说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]])
Run Code Online (Sandbox Code Playgroud)

sha*_*dow 7

您可以使用[[提取功能而不是[.

d1[[1]]
## [1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)

如果你使用了很多与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
Run Code Online (Sandbox Code Playgroud)

或者如果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
Run Code Online (Sandbox Code Playgroud)