这是一个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个)”
答案 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
可以大大简化事情。