在同一文件路径中,我有许多以相同名称开头的不同文件。示例"myfile_"
。
是csv
文件。
我有一个特定的代码,我想为每个文件执行。
此代码的输出是5个变量/列。
有没有办法读取每个文件的数据在代码中插入它们并将结果保存在一个数据框中,该数据框将有一个列,该列将是文件的名称和代码输出的列?
可再现的例子。
假设以下数据框是文件:
employee <- c('John Doe','Peter Gynn','Jolie Hope')
salary <- c(21000, 23400, 26800)
startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
myfile_1 <- data.frame(employee, salary, startdate)
myfile_2 <- read.table(header=TRUE, text="text salary
laughter 8.50
happiness 8.44
love 8.42
happy 8.30
laughed 8.26
laugh 8.22")
执行代码的示例:
sum <- sum(myfile_1$salary)
sub <- sum(myfile_1$salary)/2
addtwo <- sum(myfile_1$salary)+2
subtracttwo <- sum(myfile_1$salary)-2
doubleo <- sum(myfile_1$salary)*2
这是我想为每个文件计算的命令。所以这就是我每次要求加载一个文件的原因。
因为输出有这样的df:
filename sum sub addtwo subtracttwo doubleo
myfile_1
myfile_2
并在其他列中执行每次执行的结果
答案 0 :(得分:2)
我将你提供给csv文件的data.frames写在一个名为'input'的目录中。您可以将输入替换为您的目录。
list_files <- list.files(path = 'input', pattern = '.csv', full.names = TRUE)
do_code <- function(x) {
dat <- read.csv(x)
new_dat <- data.frame(filename = basename(x) %>% gsub(".csv", "", .))
new_dat$sum <- sum(dat$salary)
new_dat$sub <- sum(dat$salary) / 2
new_dat$addtwo <- sum(dat$salary) + 2
new_dat$subtracttwo <- sum(dat$salary) - 2
new_dat$doubleo <- sum(dat$salary) * 2
new_dat
}
# using base R
new_dat <- do.call(rbind, lapply(list_files, do_code))
# using purrr package
library(purrr)
new_dat <- map_dfr(list_files, do_code)
#> filename sum sub addtwo subtracttwo doubleo
#> 1 myfile_1 71200.00 35600.00 71202.00 71198.00 142400.00
#> 2 myfile_2 50.14 25.07 52.14 48.14 100.28
答案 1 :(得分:0)
如果要一次读取多个CSV文件并存储在单个数据框中。然后你可以试试这个。
运行此代码后首先设置工作目录
files = list.files(pattern="*.csv")
# First apply read.csv, then rbind
Data = do.call(rbind, lapply(files, function(x) read.csv(x, stringsAsFactors = F)))