修改多个CSV文件并将其全部保存为TXT格式的R

修改多个CSV文件并将其全部保存为TXT格式的R,r,dataframe,csv,R,Dataframe,Csv,我有一个包含几个.csv文件的文件夹。我需要删除所有这些.csv文件的前三行和最后一行,然后将它们全部保存为.txt。所有的文件都有相同的格式,所以我需要删除的行总是相同的。 我知道如何修改单个数据帧,但我不知道如何加载、修改和保存多个数据帧。 我是一个使用R的初学者,所以我还没有尝试过的例子。 任何帮助都将不胜感激 很难从堆栈溢出开始,但是关于可复制示例的其他评论值得将来考虑。我的建议是编写一个读取、修改和写入的函数,然后在所有文件中循环它 我无法确切地告诉您如何执行此操作,因为我看不到您的数

我有一个包含几个.csv文件的文件夹。我需要删除所有这些.csv文件的前三行和最后一行,然后将它们全部保存为.txt。所有的文件都有相同的格式,所以我需要删除的行总是相同的。 我知道如何修改单个数据帧,但我不知道如何加载、修改和保存多个数据帧。 我是一个使用R的初学者,所以我还没有尝试过的例子。
任何帮助都将不胜感激

很难从堆栈溢出开始,但是关于可复制示例的其他评论值得将来考虑。我的建议是编写一个读取、修改和写入的函数,然后在所有文件中循环它

我无法确切地告诉您如何执行此操作,因为我看不到您的数据,但类似的操作应该可以:

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)

让我们对一个数据帧执行此操作,只引用其文件名

现在我们可以将其转换为以文件名为参数的函数:

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)

欢迎来到堆栈溢出!几个问题:(1)您知道如何修改数据帧。你知道如何通过阅读CSV来创建它们吗?(2) 您知道如何使用
write.csv()
write.table()
?您只需确保文件名以
.txt
结尾即可。(3) 您知道如何将
用于
循环吗?通过“将它们全部保存为.txt”,您的意思是希望它们作为选项卡分隔的文件吗?还是别的什么
.txt
没有严格的定义。我以前使用过write.csv,也删除过行,但从未在多个数据帧上删除过。我现在所拥有的是:All_data=list.files(pattern='.*.csv')@GregorThomas是的,我想要它们制表符分隔符您可以在csv文件中读取,并使用
skip=3
忽略前3行,并使用
nrows
指定要读取的行数。非常感谢。这是我的第一个问题,所以我相信我会在以后的提问中变得更好。在询问之前,我试图找到一些例子,但把他们所有的建议放在一起仍然不起作用,因为这对我来说太高级了。谢谢你的帮助,我会试试这个。是的,这类问题比较难问,因为它涉及导入/导出,而不是其他人可以轻松地将数据放入我们自己计算机的内存中。祝你好运这种方法是有效的,除了它保留了第一行,删除了第2-4行,我假设它认为第1行是名称,并保留了它。除第一列外,它还删除了我的所有列。但它将所有文件都转换为TXT格式,这是一个很大的改进!:)啊,我明白你的意思了。我通常认为Excel中标记为1的行是具有名称的第0行。我认为您可以找出如何修改
slice
语句以获得您真正想要的内容。
readr
库只查看数据集的顶部,并假设数据基于哪些类型。如果文件中的数据以后有很大不同,则无法正确导入。您可以阅读更多关于它的内容,但可能很容易将
col\u types=cols(.default='c')
添加到
read\u csv
调用中。这对我不起作用,但肯定是因为我的.csv文件是一种结构,因为我使用不同的文件测试了它,并且它可以工作。对于我的原始文件,它给了我一个错误:read.table中的错误(file=file,header=header,sep=sep,quote=quote,:列多于列名称我建议问一个单独的问题,以找到要在文件中读取的write命令。在文本编辑器中打开该文件(如RStudio)并在新问题中向我们展示文件的前几行。
to_convert = list.files(pattern='.*.csv')
for (file in to_convert) {
  my_txt_convert(file)
}
# or
lapply(to_convert, my_txt_convert)