我记得在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)
您可以使用[[
提取功能而不是[
.
d1[[1]]
## [1] 1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
如果你使用了很多与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
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)
归档时间: |
|
查看次数: |
622 次 |
最近记录: |