R中匹配和lapply的组合

时间:2014-03-20 17:43:01

标签: r match lapply

这是我的问题。

我有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:我不是英国人,为可能的误解和语言错误道歉。

2 个答案:

答案 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)