Как использовать каждый элемент вектора в функции для создания фреймов данных, а затем добавить все фреймы данных - PullRequest
1 голос
/ 28 апреля 2020

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

Я хотел бы применить функцию к каждому имени файла в таблице «имена файлов», создавая таким образом 50 кадров данных. Я хочу добавить каждый из этих фреймов данных, я представляю, используя rbind, чтобы получить один фрейм данных в конце.

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

Я написал пример ниже, любая помощь очень с благодарностью получена!

map <- data.frame(well = c("A01", "A02", "A03", "B01", "B02", "B03", "C01", "C02", "C03", "A01", "A02", "A03", "B01", "B02", "B03", "C01", "C02", "C03"),
                  plate = c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2))

filenames <- data.frame(filenames = c("file1", "file2", "file3"),
                        plate = c(1, 1, 2))

firstdatetime <- as.POSIXct("2020-03-26 07:56:20 GMT")

activefile <- as.vector(filenames[1,1])
data <- data.frame(read.ods(activefile))

###for the purposes of this example, a sample data file is created below
data <- data.frame(datetime = "2020-03-26 13:04:38 GMT", one = c(2,4,6), two = c(4, 6, 6), three = c(5, 5, 2))
###

plate <- as.numeric(filenames$plate[match(activefile, filenames$filenames)])
datetime <- as.POSIXct(data$datetime[1])
time <- as.numeric(difftime(strptime(datetime, "%Y-%m-%d %H:%M:%S"),
                            strptime(firstdatetime, "%Y-%m-%d %H:%M:%S")))
temp <- plate
df <- subset(map, plate == temp)
df$filename <- activefile
df$time <- time

a570 <- data.frame(data[,-1])
a570 <- as.vector(t(a570))
df$a570 <- a570

###
#then repeat this for each filename in 'filenames', adding each dataframe to the bottom of the one before. The final output would be one big data frame.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

ответ hello_friend показывает, что делать, если вам просто нужно прочитать файлы и rbind() их. Для меня это не интересно, поскольку это, очевидно, дубликат.

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

Я еще больше упростил ваш пример и получил два файла ODS, file1.ods с данными

a b
1 1

и file2.ods с данными

a b
2 2

А для предварительной обработки я буду использовать более простую задачу добавления 3 к первому значению. Мы могли бы сделать следующее:

library(readODS)

filenames <- c("file1.ods", "file2.ods")

foo <- function(filename) {
    res <- read_ods(filename)
    res[1, 1] <- res[1, 1] + 3
    return(res)
}

do.call("rbind", lapply(filenames, foo))

#   a b
# 1 4 1
# 2 5 2

Конечно, вы можете сделать предварительную обработку, сделанную в foo(), настолько сложной, насколько вам нравится (включая задание имен, если необходимо, работу с датами так, как я думаю, что вы '). и т. д. c.).

0 голосов
/ 28 апреля 2020

Решение Base Base для итеративного чтения и связывания в один df:

# Filenames data provided by user: filenames => data.frame
filenames <- data.frame(filenames = c("file1", "file2", "file3"),
                        plate = c(1, 1, 2))
# Empty list to store each file: df_list => list
df_list <- vector("list", length(unique(filenames$filenames)))
# Read in files and name them appropriately: df_list => list
df_list <- setNames(lapply(filenames$filenames, function(x){
                        data.frame(read.ods(x))}), filenames$filenames)
# rbind into a single object: df => data.frame
df <- do.call("rbind", df_list)

Если вы хотите сохранить имя файла как вектор для последующего сравнения:

filenames <- data.frame(filenames = c("file1", "file2", "file3"),
                        plate = c(1, 1, 2))
df_list <- vector("list", length(unique(filenames$filenames)))

df_list <- setNames(mapply(
  cbind,
  "filename" = filenames$filename,
  lapply(filenames$filenames, function(x) {
    data.frame(read.ods(x))
  }),
  filenames$filenames
))

df <- do.call("rbind", df_list)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...