запись групп строк в виде матриц в несколько файлов в R - PullRequest
0 голосов
/ 06 июля 2018

Я новичок в stackoverflow и относительно новичок в R. Пожалуйста, укажите на все, что я делаю не так или могу сделать лучше, чтобы задать свой вопрос на этом форуме - спасибо!

У меня есть матрица в R с данными, которые были суммированы по годам и месяцам, и я хочу записать один файл в год, по 12 строк на файл (по одной строке на каждый месяц) вместе с некоторым дополнительным текстом в каждый выходной файл.

Я рассмотрел несколько различных решений на этом форуме:

В них есть элементы того, что я хочу сделать, но, похоже, tapply ограничен одним столбцом (в данном примере это «зарплата»), и я хочу взять 3, чтобы выписать. Я также смешиваю данные записи и текст произвольной формы.

Мои данные в R выглядят так:

Месяц | Год | Precip | Temp | PanEvap
01 | 2018 | 20 | -4 | 12
02 | 2018 | 15 | 0 | 10
03 | 2018 | 60 | 5 | 40
... и т. д.

(извините за отсутствие форматирования - не уверен, как составить таблицу, или использовать шрифт фиксированной ширины в окончательной публикации!)

Мне нужно выводить по одному файлу на каждый год, как этот (это будет называться «18.dat», «18», взятый из года, «2018»):

"Какой-нибудь текст здесь"
20 -4 12
15 0 10
60 5 40
... и т.д.
«Больше текста здесь»

Надеюсь, это имеет смысл. Любое руководство и пример кода будут очень благодарны.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 июля 2018

После того, как я покопался в своем коде и узнал больше о других функциях, я пришел к этому в конечном итоге, заимствуя посты, на которые я ссылался в своем первоначальном посте (и я также изменил один год на 2017, чтобы проверить несколько файлов) может быть создан):

tmp <- data.table::fread('
                         Month | Year | Precip | Temp | PanEvap
                         01 | 2018 | 20 | -4 | 12
                         02 | 2018 | 15 | 0 | 10
                         03 | 2017 | 60 | 5 | 40
                         ')
lst <- split(tmp[,3:5], tmp$Year)
lapply(names(lst),
       function(x, lst) {cat("some text up here",
                             file=paste(x,".dat", sep=""), sep="\n",append=FALSE)
                         write.table(lst[[x]], file=paste(x,".dat", sep=""),
                            col.names=FALSE, row.names=FALSE, sep="\t", 
                            quote=FALSE, append=TRUE)
                         cat("some text down here", "and more I needed, separated by a tab", 
                             file=paste(x,".dat", sep=""), sep="\t", append=TRUE)
                        },
       lst)
0 голосов
/ 06 июля 2018

Попробуйте это

# Read data
tmp <- data.table::fread('
Month | Year | Precip | Temp | PanEvap
01 | 2018 | 20 | -4 | 12
02 | 2018 | 15 | 0 | 10
03 | 2018 | 60 | 5 | 40
')


years = unique(tmp$Year)

for (i in years){

    text1 = "Some text up here"
    # remove month and year column
    tmp_df =tmp[which(tmp$Year == i),c(-1,-2)] 
    text2 = "More text down here"
    # use file connection with append mode

    fileConn <- file(paste0("./",i,".dat"),open="w")
    writeLines(text1, fileConn)
    close(fileConn)

    fileConn <- file(paste0("./",i,".dat"),open="a")     
    write.table(tmp_df, fileConn,col.names = FALSE,row.names = FALSE)
    writeLines(text2,fileConn)
    close(fileConn)
}

и в 2018.dat:

    Some text up here
    20 -4 12
    15 0 10
    60 5 40
    More text down here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...