我想我找到了您的解决方案,但可能需要您提供更多详细信息才能确认:
第一步:
您首先要为每个文件获取 col() 输出,您可以手动执行或使用 spec_col() 公式为您自动提取该输出(我将在下面显示)。
#first create mock dataframe
df1 <- tibble(x=1:3,y=letters[1:3])
df2 <- tibble(a=letters[4:6],b=4:6)
write_csv(df2,file = "df2.csv")
write_csv(df1,file = "df1.csv")
#create file path to pull in files
file_path <- list.files(path=".",pattern="df")
#extract out each file's col_type, set the default, and put it into a list
list <- map(file_path,
~spec_csv(.x,
col_types = cols(.default=col_character())
)
)
这会产生以下输出:
> list
[[1]]
cols(
x = col_double(),
y = col_character()
)
[[2]]
cols(
a = col_character(),
b = col_double()
)
第二步:分配默认值(可选)
如果你想分配一个默认值,那么你需要使用下面的 for 循环(我不知道如何用 map 做到这一点,但下面的工作)。这基本上利用了cols 类对象的特殊属性,并根据您分配的内容分配默认值。如果您为其分配文字字符值,则默认值将变为字符。如果你给它分配一个文字数值,那么默认值将变成数值。
#get the length of your list
x <- seq_along(list)
#loop through each element of the list and assign the <collect_guess> argument a value
for(i in x){
list[[i]][[2]] <- list[[i]][[2]] <- "character"
}
这会产生以下输出:
> list
[[1]]
cols(
.default = col_character(),
x = col_double(),
y = col_character()
)
[[2]]
cols(
.default = col_character(),
a = col_character(),
b = col_double()
)
第三步:
使用这个存储每个文件的 col() 参数的变量“list”,我们需要创建一个新的 tibble,将 col() 参数与相应的文件配对。我们可以用一个简单的 tibble 来做到这一点。
col_map<- tibble(x=list,y=file_path)
第 4 步
然后使用map2_df 函数,它允许您同时通过两个向量(在本例中为col() 参数(.x)和文件路径(.y)到一个公共函数read_csv
map2_df(.x=col_map$x,
.y=col_map$y,
.f = ~read_csv(file=.y,col_types=.x)
)
这应该将您的所有文件保存到一个新的 tibble。