我有一个非常大的数据框,我正在对 中的列子集执行多个操作lapply,其中包括使用导出子集data.table::fwrite
我有多列字母相同但大小写不同的列(例如 Co2 和 CO2)。当我获取列名并lapply使用dplyr::select选择的正确列运行该过程时(即选择正确的大小写),但是当我导出数据时,某些导出的文件名的大小写不正确,而其他文件名的大小写正确。
例如,下面是一个示例数据框
test_df <- data.frame('CO2' = c(1,2,3,4,5),
'Co2' = c(6,7,8,9,10))
CO2 Co2
1 1 6
2 2 7
3 3 8
4 4 9
5 5 10
Run Code Online (Sandbox Code Playgroud)
下面是我用来选择所使用的列的代码,lapply后面是使用的数据集的简单子集lapply(请注意输出与预期一致)。
test_colnames <- test_df %>% colnames()
lapply(test_colnames, function(x){
var_name <- all_of(x)
export <- test_df %>%
select(!!var_name) })
[[1]]
CO2
1 1
2 2
3 3
4 4
5 5
[[2]]
Co2
1 6
2 7
3 8
4 9
5 10
Run Code Online (Sandbox Code Playgroud)
当我尝试使用下面的代码导出子集时,我只得到一个输出文件(而不是两个),该文件名为 CO2,但包含来自 Co2 的数据。不知何故,Co2 已大写作为输出名称(但不是列名称)并覆盖 CO2 文件。
lapply(test_colnames, function(x){
var_name <- all_of(x)
export <- test_df %>%
select(!!var_name)
export %>% data.table::fwrite(paste0(data_directory, "test_out_", all_of(x), ".csv")) })
Run Code Online (Sandbox Code Playgroud)
仅输出一个名为 test_out_CO2.csv 的文件,但以下是该文件的内容。
Co2
1 6
2 7
3 8
4 9
5 10
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题有什么想法吗?
编辑:简化的示例,下面将仅输出一个文件 - “testName.txt”:
library(data.table)
fwrite(mtcars[1:2], "testName.txt")
fwrite(mtcars[3:4], "testname.txt")
Run Code Online (Sandbox Code Playgroud)
这不是data.table特定的问题,Windows 文件名不区分大小写。
我建议使列名非常独特:
colnames(test_df) <- make.unique(tolower(colnames(test_df)), sep = "_")
colnames(test_df)
# [1] "co2" "co2_1"
# ... rest of your code
Run Code Online (Sandbox Code Playgroud)