我有近 3.000 个格式相同的 CSV 文件(包含推文),我想将这些文件合并到一个新文件中并删除重复的推文。我遇到过讨论类似问题的各种主题,但是文件数量通常很少。我希望您能帮助我在 R 中编写代码,以高效且有效地完成这项工作。
CSV 文件具有以下格式:
CSV 格式的图像:
我将(在第 2 列和第 3 列中)用户名(在 Twitter 上)更改为 AE,将“实际名称”更改为 A1-E1。
原始文本文件:
"tweet";"author";"local.time"
"1";"2012-06-05 00:01:45 @A (A1): Cruijff z'n met-zwart-shirt-zijn-ze-onzichtbaar logica is even mooi ontkracht in #bureausport.";"A (A1)";"2012-06-05 00:01:45"
"2";"2012-06-05 00:01:41 @B (B1): Welterusten #BureauSport";"B (B1)";"2012-06-05 00:01:41"
"3";"2012-06-05 00:01:38 @C (C1): Echt ..... eindelijk een origineel sportprogramma #bureausport";"C (C1)";"2012-06-05 00:01:38"
"4";"2012-06-05 00:01:38 @D (D1): LOL. \"Na onderzoek op de Fontys Hogeschool durven wij te stellen dat..\" Want Fontys staat zo hoog aangeschreven? #bureausport";"D (D1)";"2012-06-05 00:01:38"
"5";"2012-06-05 00:00:27 @E (E1): Ik kijk Bureau sport op Nederland 3. #bureausport #kijkes";"E (E1)";"2012-06-05 00:00:27"
不知何故,我的标题搞砸了,他们显然应该向右移动一列。每个 CSV 文件最多包含 1500 条推文。我想通过检查第二列(包含推文)来删除重复项,因为它们应该是唯一的并且作者列可以相似(例如,一位作者发布多条推文)。
是否可以将合并文件和删除重复文件结合起来,或者这是在自找麻烦,是否应该将进程分开?作为起点,我在 Hayward Godwin 的两个博客中包含了两个链接,其中讨论了合并 CSV 文件的三种方法。
显然,这个站点上也有一些与我的问题相关的主题(例如Merging multiple csv files in R),但我没有找到任何讨论合并和删除重复项的内容。我真的希望你能帮助我和我有限的 R 知识应对这个挑战!
尽管我尝试了一些在网上找到的代码,但这实际上并没有产生输出文件。大约 3.000 个 CSV 文件具有上述格式。我的意思是尝试了以下代码(用于合并部分):
filenames <- list.files(path = "~/")
do.call("rbind", lapply(filenames, read.csv, header = TRUE))
这会导致以下错误:
Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") :
cannot open file '..': No such file or directory
更新
我尝试了以下代码:
# grab our list of filenames
filenames <- list.files(path = ".", pattern='^.*\\.csv$')
# write a special little read.csv function to do exactly what we want
my.read.csv <- function(fnam) { read.csv(fnam, header=FALSE, skip=1, sep=';', col.names=c('ID','tweet','author','local.time'), colClasses=rep('character', 4)) }
# read in all those files into one giant data.frame
my.df <- do.call("rbind", lapply(filenames, my.read.csv))
# remove the duplicate tweets
my.new.df <- my.df[!duplicated(my.df$tweet),]
但我遇到以下错误:
在第三行之后,我得到:
Error in read.table(file = file, header = header, sep = sep, quote = quote, : more columns than column names
在第 4 行之后,我得到:
Error: object 'my.df' not found
我怀疑这些错误是由 csv 文件的写入过程中的一些失败引起的,因为有些情况下 author/local.time 在错误的列中。在他们应该在的位置的左侧或右侧,这会导致额外的列。我手动调整了 5 个文件,并在这些文件上测试了代码,我没有收到任何错误。然而,它似乎什么也没发生。我没有从 R 得到任何输出?
为了解决额外的列问题,我稍微调整了代码:
#grab our list of filenames
filenames <- list.files(path = ".", pattern='^.*\\.csv$')
# write a special little read.csv function to do exactly what we want
my.read.csv <- function(fnam) { read.csv(fnam, header=FALSE, skip=1, sep=';', col.names=c('ID','tweet','author','local.time','extra'), colClasses=rep('character', 5)) }
# read in all those files into one giant data.frame
my.df <- do.call("rbind", lapply(filenames, my.read.csv))
# remove the duplicate tweets
my.new.df <- my.df[!duplicated(my.df$tweet),]
我在所有文件上都尝试了这段代码,虽然 R 显然开始处理,但我最终得到了以下错误:
Error in read.table(file = file, header = header, sep = sep, quote = quote, : more columns than column names
In addition: Warning messages:
1: In read.table(file = file, header = header, sep = sep, quote = quote, : incomplete final line found by readTableHeader on 'Twitts - di mei 29 19_22_30 2012 .csv'
2: In read.table(file = file, header = header, sep = sep, quote = quote, : incomplete final line found by readTableHeader on 'Twitts - di mei 29 19_24_31 2012 .csv'
Error: object 'my.df' not found
我做错了什么?