我需要打开多个txt(都有相同数量的变量和变量名称,见图[1]);对于每个列,添加带有其文件名特定部分的多个列;然后保存合并所有文本的CSV文件,其中添加的列对应于每个文本的唯一文件名。
文件名看起来像:
NVR_ch2_main_20220505140000_20220505150000
和我需要三列:
Month (05, the first of the two after 2022),
Day (05) and
hour (14).
一个文本数据源的示例
dput(head('NVR_ch2_main_20220505132105_20220505140000.txt'))
# A tibble: 41 x 8
Selection View Channel Begin Time (s) End Time (s) Low Freq (Hz) High Freq (Hz)
type <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl>
1 1 Waveform 1 1 790. 792. 0 4000 NA
# ... with 37 more rows
我用一个文件的整个文件名管理这个过程:
read_tsv('NVR_ch2_main_20220505132105_20220505140000.txt') %>%
mutate(filename = 'NVR_ch2_main_20220505132105_20220505140000.txt') %>%
select(filename, everything ()) %>%
write_csv('C:/Users/marta/Documents/R/Crete/NVR_ch2_main_20220505132105_20220505140000.csv')
试试这个。我不能保证它会起作用,因为我没有你的数据,但这应该找到所有的文件与共同的前缀,提取月,日和小时从文件名,然后读取所有的数据作为一个组合文件:
library(tidyverse)
tibble(file = list.files(pattern = "NVR.*\.txt")) |>
extract(file,
into = c("month", "day", "hour"),
regex = ".*\w_\d{4}(\d{2})(\d{2})(\d{2})\d{4}_",
remove = FALSE,
convert = TRUE) |>
mutate(data = map(file, read_tsv)) |>
unnest(data)
library(tidyverse)
list_of_files <- list.files("C:/Users/marta/Documents/R/Crete", pattern="tsv", full.names=T)
fun1 <- function(x) {
df1 <- read_tsv(x, comment = "#")
newname <- gsub("tsv", "csv", x)
df1$month <- rep(str_sub(x, 18, 19), nrow(df1))
df1$day <- rep(str_sub(x, 20, 21), nrow(df1))
df1$hour = rep(str_sub(x, 22, 23), nrow(df1))
write.csv(df1, newname)
}
lapply(list_of_files, fun1)
您可能需要调整str_sub()
调用中的数字,以便从文件名中获得正确的位置。
注意列可能是字符。如果您需要month
, day
和hour
的数字,您应该将str_sub()
更改为as.numeric(str_sub())
。