首页 > 解决方案 > 将 R 循环的结果写入 csv

问题描述

这是一个 csv,包括许多论文的详细信息,例如论文的标题和论文的作者地址。我正在尝试从有关作者地址的字符串中提取名称。字符串之一如下。

Jacod, Jean@Univ Paris 06, Inst Math Jussieu, F-75005 Paris, 
France::Reiss, Markus@Humboldt Univ, Inst Math, D-10099 Berlin, 
Germany

我的目标是在新的 csv 中打印“Jacod,Jean”“Reiss,Markus”的 2 个单元格中的 2 个名称。

Jacod, Jean   Reiss, Markus

我可以从长字符串中提取关键字。但我不能只在一个 csv 中输出 R 循环的所有结果。

我尝试在循环中使用“write.csv”,但失败了。

data<-read.csv('E:\\data\\ANNALS.csv')
da<-data$authors_address
for (string in da){
    re<-sub('(^.+)@.*$', '\\1', unlist(strsplit(string, '::')))
    write.csv(re,file="E:\\output.csv",append=TRUE)
}

我希望输出一个新的csv,其中每一行包含一篇论文的2~3个作者的名字。上面代码的结果是错误“有 50 个或更多警告(使用 warnings() 查看前 50 个)”

标签: r

解决方案


根据您的代码和您对数据的描述,我推断出每个字符串data$authors_address实际上看起来更像这样,作者信息由以下分隔::

Jacod, Jean@Univ Paris 06, Inst Math Jussieu, F-75005 Paris, France::Reiss, Markus@Humboldt Univ, Inst Math, D-10099 Berlin, Germany

一个建议:CSV 只是一种平面文件,如果作者数量不同,它可能不适合您的输出。它仍然可行,但它们是更好的选择。一个简单的文本文件,每组作者都附加到一个新的行,会很好地工作。例如:

for (s in data$authors_address){
    re <- paste(sub("(.*)@.*", "\\1", strsplit(s, "::")[[1]]), collapse = " - ")
    write(re, "E:\\output.txt", append = T)
}

该文件output.txt看起来像这样:

Jacod, Jean - Reiss, Markus
Doe, John - Doe, Jane - Guy, Some
Butts, Seymour
...

请注意,我首先使用-作为分隔符来折叠向量,否则每个向量元素将被附加到自己的行中。如果您使用其他write.*选项之一,您也需要这样做。

您可以使用write.table (write.csv附加时可能会有点奇怪,所以我不推荐它)做类似的事情,但是需要更多的参数才能使它正确:

for (s in data$authors_address){
    re <- paste(sub("(.*)@.*", "\\1", strsplit(s, "::")[[1]]), collapse = " - ")
    write.table(re, file = "E:\\output.csv", append = T, sep = ",", col.names = F,
                row.names = F
                )
    }

如您所见,使用write而不是write.table/write.csv简化了很多事情。


推荐阅读