问题描述
readr :: type_convert猜测数据帧中每列的类。我想将type_convert仅应用于数据框中的某些列(以将其他列保留为字符)。 MWE:
# A data frame with multiple character columns containing numbers.
df <- data.frame(A = letters[1:10],B = as.character(1:10),C = as.character(1:10))
# This works
df %>% type_convert()
Parsed with column specification:
cols(
A = col_character(),B = col_double(),C = col_double()
)
A B C
1 a 1 1
2 b 2 2
...
但是,我只想将该函数应用于列B(这是一个典型的示例;可能有多个列要尝试转换)。我尝试使用purrr :: map_at以及sapply,如下所示:
# This does not work
map_at(df,"B",type_convert)
Error in .f(.x[[i]],...) : is.data.frame(df) is not TRUE
# This does not work
sapply(df["B"],type_convert)
Error in FUN(X[[i]],...) : is.data.frame(df) is not TRUE
有没有一种方法可以仅将type_convert选择性地应用于数据帧的某些列?
编辑:@ekoam为type_convert提供了答案。但是,将此答案应用于许多专栏将是乏味的。最好使用base :: type.convert函数,该函数可以映射:
purrr::map_at(df,type.convert) %>%
bind_cols()
# A tibble: 10 x 3
A B C
<chr> <int> <chr>
1 a 1 1
2 b 2 2
解决方法
尝试一下:
df %>% type_convert(cols(B = "?",C = "?",.default = "c"))
猜测B
的类型;其他任何字符列均保持不变。棘手的部分是,如果任何列都不是字符类型,那么type_convert
也将保持不变。因此,如果您真的必须type_convert
,也许您必须首先将所有列都转换为字符。
type_convert
似乎不支持它。我使用过几次的一种技巧是使用select
和bind_cols
的组合,如下所示。
df %>%
select(B) %>%
type_convert() %>%
bind_cols(df %>% select(-B))