将R循环的结果写入csv

时间:2019-06-04 16:28:44

标签: r

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

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

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

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个)”

1 个答案:

答案 0 :(得分:0)

根据您的代码和对数据的描述,我推断出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可以大大简化事情。