在R中修改多个CSV文件并将它们全部保存为TXT

3

我有一个包含几个 .csv 文件的文件夹。我需要删除所有这些 .csv 文件的前三行和最后一行,然后将它们全部保存为 .txt 文件。所有文件都具有相同的格式,因此我需要删除的始终是相同的行。 我知道如何修改单个数据框,但不知道如何加载、修改并另存为 txt 格式的多个数据框。 作为 R 的初学者,我还没有尝试过任何示例。 非常感谢您的帮助!


1
欢迎来到Stack Overflow!有几个问题:(1)您知道如何修改数据框。您知道如何通过读取CSV文件来创建它们吗?(2)您知道如何使用write.csv()write.table()吗?只需确保文件名以.txt结尾即可。(3)您知道如何使用for循环吗? - duckmayr
1
“将它们全部保存为 .txt”,您的意思是要将它们保存为以制表符分隔的文件吗?还是其他什么格式?“.txt”没有严格的定义。 - Gregor Thomas
我以前使用过write.csv,也曾经删除过行,但从未在多个数据框上进行过。现在我手头只有这个:all_data=list.files(pattern='.*.csv') - Clau Martinez
@GregorThomas 是的,我想要它们以制表符分隔。 - Clau Martinez
1
您可以使用skip=3忽略CSV文件中的前3行,并使用nrows参数指定要读取的行数。 - Edward
显示剩余2条评论
2个回答

4

起初使用stackoverflow可能会比较困难,但是其他评论关于可重复示例的建议值得我们在未来考虑。我建议编写一个函数,用于读取、修改和写入数据,然后将其循环应用于所有文件。

由于看不到你的数据,无法确定具体如何实现,但以下类似代码可以参考:

library('tidyverse')

old_paths = list.files(
  path = your_folder,
  pattern = '\\.csv$',
  full.names = TRUE
)

read_write = function(path){

  new_filename = str_replace(
    string = path,
    pattern = '\\.csv$',
    replacement = '.txt'
  )

  read_csv(path) %>% 
    slice(-(1:3)) %>% 
    slice(-n()) %>% 
    write_tsv(new_filename) %>% 
    invisible()
}

lapply(old_paths, read_write)

1
非常感谢。这是我的第一个问题,所以我相信以后会越来越好。在提问之前,我试图找到一些例子,但把所有他们的建议汇总起来仍然不起作用,因为对我来说太难了。谢谢你的帮助,我会尝试这个。 - Clau Martinez
1
是的,这种问题有点难以提出,因为它涉及到导入/导出而不是其他人可以轻松放入我们自己计算机内存中的数据。祝你好运! - svenhalvorson
这种方法有点奏效,但它保留了第一行并删除了第2-4行。我猜测它认为第1行是名称,所以保留了它。此外,它删除了除第一列之外的所有列。但是,它将所有文件转换为TXT格式,这是一个很大的改进! :) - Clau Martinez
1
啊,我明白你的意思了。通常我会把Excel中标记为1的行视为0行,它包含名称。我想你可以想办法修改“slice”语句来得到你真正想要的内容。 - svenhalvorson
1
readr 库只查看数据集的顶部,并根据此做出数据类型的假设。如果文件后面的数据非常不同,则无法正确导入。您可以在这里了解更多信息,但是在 read_csv 调用中添加 col_types = cols(.default = 'c') 可能很容易解决问题。 - svenhalvorson
显示剩余2条评论

1

让我们针对一个数据框架进行操作,只引用其文件名

input_file = "my_data_1.csv"
data = read.csv(input_file)
# modify
data = data[-(1:3), ] # delete first 3 rows
data = data[-nrow(data), ] # delete last row
# save as .txt
output_file = sub("csv$", "txt", input_file)
write.table(x = data, file = output_file, sep = "\t", row.names = FALSE)

现在我们可以将其转化为一个接受文件名作为参数的函数:
my_txt_convert = function(input_file) {
  data = read.csv(input_file)
  # modify
  data = data[-(1:3), ] # delete first 3 rows
  data = data[-nrow(data), ] # delete last row
  # save as .txt
  output_file = sub("csv$", "txt", input_file)
  write.table(x = data, file = output_file, sep = "\t", row.names = FALSE)
}

然后我们对您的所有文件调用该函数:
to_convert = list.files(pattern='.*.csv')
for (file in to_convert) {
  my_txt_convert(file)
}
# or
lapply(to_convert, my_txt_convert)

这对我没有用,但肯定是因为我的.csv文件结构的方式不同,因为我用另一个文件测试过了,它可以工作。对于我的原始文件,它会给我一个错误:Error in read.table(file = file, header = header, sep = sep, quote = quote, : more columns than column names - Clau Martinez
我建议您提出一个单独的问题,以查找读取文件的正确命令。在文本编辑器(如RStudio)中打开文件,并在新问题中向我们展示文件的前几行。 - Gregor Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接