Как обобщить это построение с двумя CSV -fs для многих в R? - PullRequest
0 голосов
/ 05 января 2012

2 CSV фс: работает

    read.table('./Trial7/glob.csv')->e1
    read.table('./Trial7/keh.csv')->e2
    b1<-data.frame(as.Date(e1$V1, "%d.%m.%Y"), e1$V2)
    b2<-data.frame(as.Date(e2$V1, "%d.%m.%Y"), e2$V2)

    png('./Pictures/compare2.png')
    plot(b1, type='l', ylim=range(b1[2],b2[2]))
    lines(b2)

    dev.off()

Общий случай: не работает

    trial_files<-Sys.glob('./Trial7/*.csv')

    lapply(trial_files, read.table)->e
    b<-data.frame(as.Date(e$V1, "%d.%m.%Y"), e$V2)   ## ERR? (1)
    png('./Pictures/compareMany.png')
    plot(b[1], type='l', ylim=range(b[,2]))          ## ERR? (2)
    lines(b[2])                                      ## Not general, have to 
                                                     ## solve 1/2 first

    dev.off()

Мне трудно объяснить это без Pythonic-списков, поэтому я хочу:

[data.frame(as.Date(ee$V1, "%d.%m.%Y"), ee$V2) for ee in e]

... теперь с R, немного lapply(...) или как это сделать со списком?

Ответы [ 3 ]

3 голосов
/ 05 января 2012
b <- lapply(Sys.glob('Trial7/*.csv'), function(file) {
    e <- read.table(file)
    data.frame(as.Date(e$V1, "%d.%m.%Y"), e$V2)
})

png('./Pictures/compare2.png')
plot(b[[1]], type='l', ylim=range(b[[1]][[2]],b[[2]][[2]]))
lines(b[[2]])
0 голосов
/ 05 января 2012

Поскольку С. отклонил мое редактирование, и я думаю, что это важно для general дела, поэтому, отвечая себе, вы можете обобщить диапазон и строки с помощью:

# Remixing Simon's answer
b <- lapply(Sys.glob('Trial7/*.csv'), function(file) {
    e <- read.table(file)
    data.frame(as.Date(e$V1, "%d.%m.%Y"), e$V2)
})

png('./Pictures/compare2.png')

# Generalizing here the range and lines
vals<-do.call(rbind, b)[[2]] 
plot(b[[1]], type='l', ylim=range(vals)) 
lapply(b[-1], function(file){ lines(file)}) 
dev.off()

Я не могу понять, почему это было отклонено, поэтому не стесняйтесь комментировать, если что-то не так.

0 голосов
/ 05 января 2012

Вы должны продолжить выполнение каждого этапа, поэтому первое исправление будет выглядеть примерно так:

b <- lapply(e, function(x) data.frame(as.Date(x$V1, "%d.%m.%Y"), x$V2) )

Это даст вам список data.frames, измененных из списка данных.кадры читаются в e.

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

Вероятно, это не тот ответ, который вам нужен, но я думаю, что идиома * apply лучше всего применять для операций с существующими структурами данных R, а не для операций ввода-вывода.

...