записать результаты цикла R в CSV - PullRequest
0 голосов
/ 04 июня 2019

Это CSV, включающий информацию о многих статьях, например, название статьи и адрес автора статьи. Я пытаюсь извлечь имена из строки об адресе авторов. Одна из строк выглядит следующим образом.

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

И моя цель - напечатать "Jacod, Jean", "Reiss, Markus" 2 имени в 2 ячейках строки в новом CSV.

Jacod, Jean   Reiss, Markus

Я могу извлечь ключевое слово из длинной строки. Но я не могу вывести все результаты цикла R только в одном CSV.

Я пытался использовать «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 голосов
/ 04 июня 2019

Исходя из вашего кода и вашего описания данных, я пришел к выводу, что каждая строка в 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 немного упрощает вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...