如何在函数中使用向量的每个元素来创建数据框,然后附加所有数据框
How to use each element of vector in a function to create data frames, then append all the data frames
我想将数据框(文件名)的一列的每一行中的值用作函数中的参数。此函数从具有匹配文件名的 .ods 文件导入数据,并将信息提取到新数据帧中。
我想将该函数应用于 table 'filenames' 中的每个文件名,从而创建大约 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.
Base R解决迭代读取和rbinding成单个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)
显示了如果您只需要读入文件和 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()
中完成的预处理设置得尽可能复杂(包括根据需要设置名称、按照我认为的方式处理日期等)。
我想将数据框(文件名)的一列的每一行中的值用作函数中的参数。此函数从具有匹配文件名的 .ods 文件导入数据,并将信息提取到新数据帧中。
我想将该函数应用于 table 'filenames' 中的每个文件名,从而创建大约 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.
Base R解决迭代读取和rbinding成单个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)
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()
中完成的预处理设置得尽可能复杂(包括根据需要设置名称、按照我认为的方式处理日期等)。