例如,我有一个这样的小标题。测试 <- tibble(a = 10, b = "a")
通过这个输入,我想要一个可以返回代表双精度和字符的“dc”的函数。
我问这个的原因是我想读取大量文件。我不想让 read_table 函数决定每列的类型。我可以手动指定字符串,但由于我要导入的实际数据有 50 列,因此手动执行非常困难。
谢谢。
虽然前面提到的test %>% summarise_all(class)将为您提供列的类名,但它是以长形式提供的,而在这个问题中,您将它们转换为表示某些内容的单字符代码read_table col_types。要将类名映射到单字母代码,您可以使用查找表,这是一个(不完整)示例dput:
structure(list(col_type = c("character", "integer", "numeric",
"double", "logical"), code = c("c", "i", "n", "d", "l")), .Names = c("col_type",
"code"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-5L))
Run Code Online (Sandbox Code Playgroud)
现在使用这个表,我将其称为types,我们最终可以在单个字符串中转换列类型:
library(dplyr)
library(tidyr)
library(stringr)
test %>%
summarise_all(class) %>%
gather(col_name, col_type) %>%
left_join(types) %>%
summarise(col_types = str_c(code, collapse = "")) %>%
unlist(use.names = FALSE)
Run Code Online (Sandbox Code Playgroud)
这会获取每列的类 ( summarise_all),然后将它们收集到与列名称和列类型 ( ) 相匹配的 tibble 中gather。left_join列上的匹配项并col_type为每个列名称提供 1 个字符的短代码。现在我们不对列名执行任何操作,因此只需使用 asummarise和连接即可str_c。最后unlist把绳子从小嘴里拉出来。