这是我的问题。
我有8 * 3个数据帧。 8年(2005年至2012年)和每年我有三个数据框架对应生态,花卉分布和位置。 csv文件的名称基于相同的类型(flowerdistrib_2005.csv,ecology_2005.csv,...)
我想每年构成一个数据框,其中包含" flowerdistrib"的所有列。文件和"生态学的一部分"和"位置"的。
由于这个脚本,我导入了所有这些:
listflower = list.files(path = "C:/Directory/.../", pattern = "flowerdistrib_")
for (i in listflower) {
filepath1 <- file.path("C:/Directory/.../",paste(i))
assign(i,read.csv(filepath1, sep=";", dec=",", header=TRUE))
}
生态和位置相同。
然后我想用每个特定列的三个文件做每年的vlookup。 在每年,csv文件生态,位置和flowerdistrib都有一个名为&#34; idp&#34;共同的。
我知道该怎么做一年。我使用以下脚本:
2005示例,提取名为&#34; xl93&#34;的列。出现在文件location_2005.csv中:
flowerdistrib_2005[, "xl93"] = location_2005$"xl93"[match(flowerdistrib_2005$"idp", location_2005$"idp")]
但我多年来都不知道如何继续这样做一次。我正在考虑使用for循环和lapply函数,但我不能很好地处理它,因为我是R初学者。
我将非常感谢所有人的帮助。
非常感谢。
PS:我不是英国人,为可能的误解和语言错误道歉。答案 0 :(得分:2)
这是对read.csv过程的一种重新组织,但您可以使用类似下面的脚本来完成您需要做的事情。它将创建一个列表data
,其中包含指定年份的所有数据帧。如果输入表都具有完全相同的结构,您还可以将所有这些数据帧合并为一个。
希望这有帮助,不确定下面的代码是否有效,如果您复制粘贴它并更新路径,但是非常类似于此的东西可能对您有用。
# Prepare empty list
data <- list()
# Loop through all years
for(year in 2005:2012){
# Load data for this year
flowers <- read.csv(paste('C:/Directory/.../a/flowerdistrib_', year, '.csv', sep=''), sep=";", dec=",", header=TRUE)
ecology <- read.csv(paste('C:/Directory/.../a/ecology_', year, '.csv', sep=''), sep=";", dec=",", header=TRUE)
location <- read.csv(paste('C:/Directory/.../a/location_', year, '.csv', sep=''), sep=";", dec=",", header=TRUE)
# Merge data for this specific year, using idp as identifier
all <- merge(flowers, ecology, by = "idp", all = TRUE)
all <- merge(all, location, by = "idp", all = TRUE)
# Add a year column with constant year value to data
all$year <- year
# Drop unused columns
dropnames = c('column_x', 'column_y')
all <- all[,!(names(all) %in% dropnames)]
# Or alternatively, only keep wanted columns
keepnames = c('idp', 'year', 'column_z', 'column_v')
all <- all[keepnames]
# Append data to list
data[[as.character(year)]] <- all
}
# At this point, data should be a list of dataframes with all data for each year
# so this should print the summary of the data for 2007
summary(data[['2007']])
# If all years have the very same column structure,
# you can use use rbind to combine all years into one big dataframe
data <- do.call(rbind, data)
# This would summarize the data frame with all data combined
summary(data)
答案 1 :(得分:0)
这是使用一些函数式编程概念的较短版本。首先,我们编写一个函数read_and_merge
,它接受一年作为参数,构建一年的文件列表,将它们读入data_
,这是一个由三个文件组成的列表。最后一招是使用递归合并三个数据帧的Reduce
函数。我假设唯一的常见列是idp
。
read_and_merge <- function(year, mydir = "C:/Directory/.../a/"){
files_ = list.files(mydir, pattern = paste("*_", year, ".csv"))
data_ = lapply(files_, read.csv, sep = ";", dec = ",", header = TRUE)
Reduce('merge', data_)
}
第二步是创建年份列表,并使用lapply
为每年创建数据集。
mydata = lapply(2005:2012, read_and_merge)