在R中有条件地删除文件

sqserrrh  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(222)

我的时间序列数据如下:
第一页_0101_0601_A第一页_0101_0603_A第一页_0101_0605_B第一页_0101_0608_B第一页_0101_0610_C第一页_0101_0612_C第一页_0101_0615_A第一页_0101_0617_A第一页_0101_0619_A第一页_0101_0622_B第一页_0101_0624_B第一页_0101 - 0626-C和L1 - 0101 - 0629
等等。

我想有条件地保留文件,我想只保留A、B、C结尾的两个连续的文件,在文件列表中,有时会出现A或B或C结尾的三个连续的文件,这时我想删除最后一个文件。
在这个例子中,我想删除"L1_0101_0619_A",因为它是结束A的第三个文件。我将保留其他两个。像这样,有几个文件,我想删除。

mklgxw1f

mklgxw1f1#

我假设文件名中的字母是分组字母,文件的顺序是在这个字母之前的最后3位数字。
然后,第一个任务是提取这两个数据,这两个数据将在下面描述,并产生矢量。

DF是从这些文件和文件列表中构建的,然后对文件列表进行分组、排序和切片,以便提取每组中除最后一个文件外的所有文件。

file.remove需要一个完整的路径。假设文件在当前目录中,您可以像下面描述的那样对pastehere::here()执行此操作。

library(tidyverse)

l <- c("L1_0101_0601_A", "L1_0101_0603_A", "L1_0101_0605_B", 
"L1_0101_0608_B", "L1_0101_0610_C", "L1_0101_0612_C",
"L1_0101_0615_A", "L1_0101_0617_A", "L1_0101_0619_A",
"L1_0101_0622_B", "L1_0101_0624_B", "L1_0101_0626_C",
"L1_0101_0629_C")

# create the order no, which is assumed to be the last 3 digits
ll <- sapply(str_split(l, '_'), `[`, 3) |> as.numeric()

# extract the grouping factor, which is the letter
aa <- sapply(str_split(l, '_'), `[`, 4) 

# create a DF, group_by(letter), order and extract
# all but the last member of each group
files_delete <- data.frame(
  file_list = l,
  order = ll,
  letter = aa
) |> 
  group_by(letter) |> 
  arrange(order) |> 
  slice(-n()) |> pull(file_list)

# get full path 
files_to_delete <- paste(here::here(), files_delete, sep = '/)
# remove files
file.remove(files_to_delete)

相关问题