我记得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]])
答案 0 :(得分:7)
您可以使用[[
提取功能代替[
。
d1[[1]]
## [1] 1 2 3 4 5
如果你在dplyr中使用了大量的管道,你可能还想使用extract
包中的便捷功能extract2
和magrittr
:
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