编辑:我想我是通过使用R.utils包中的getAbsolutePath函数解决了这个问题。
wage_data_files <- list.files("WageData", full.names=TRUE, recursive=TRUE)
all_files <- grep(paste(toMatch, collapse = "|"), wage_data_files, value=TRUE)
files_vector <- vector()
for (i in seq_along(all_files){
files_vector <- c(files_vector, getAbsolutePath(all_files[i]))}
再次感谢所有帮助。
我正在尝试在文件夹集合中提取.csv文件的子集。我想将它们全部放入向量中,然后从每个文件中提取特定值并将该值放入向量中。代码我的问题是关于如何将我想要提取值的所有文件都放到一个向量中,然后我可以运行for循环来提取我想要的值并将它们放到向量中。
这是文件夹结构:
桌面 - &gt; WageData - &gt; 21个文件夹(sic.1980.annual.by.area; sic.1981.annual.by area,直到sic.2000.annual.by.area) - &gt;在上述每个文件夹中大约有1000个.csv文件。
我正在尝试提取每个文件夹中的六个.csv文件:“Idaho - Statewide”,“Indiana - Statewide”,“Michigan - Statewide”, “俄克拉荷马州 - 全州”,“德克萨斯州 - 全州”和“威斯康星州 - 全州”
因此共有126个文件:每年6个,为21年。以下是特定文件命名的几个示例:
sic.1980.annual 40000(俄克拉荷马州 - 全州)
sic.1980.annual 55000(威斯康星州 - 全州)
这是我的代码:
setwd("~/Desktop")
wage_data_files <- list.files("WageData", full.names=TRUE)
for (i in seq_along(wage_data_files)){
year_files <- list.files(wage_data_files[i])
toMatch <- c("Idaho -- Statewide", "Indiana -- Statewide", "Michigan -- Statewide",
"Oklahoma -- Statewide", "Texas -- Statewide", "Wisconsin -- Statewide")
dat <- data.frame()
states_vector1 <- c(dat, grep(paste(toMatch, collapse = "|"), year_files, value=TRUE))
print(states_vector1)}
当我尝试调试时,我遇到的一个问题是我无法正确打印出结果。当我把大括号放在print语句后面时,我得到一个这样的列表:
[[1]] [1]“sic.1980.annual 16000(Idaho - Statewide).csv”
[[2]] [1]“sic.1980.annual 18000(Indiana - Statewide).csv”
[[3]] [1]“sic.1980.annual 26000(密歇根州 - 全州).csv”
[[4]] [1]“sic.1980.annual 40000(俄克拉荷马州 - 全州).csv”
[[5]] [1]“sic.1980.annual 48000(Texas-Statewide).csv”
[[6]] [1]“sic.1980.annual 55000(威斯康星州 - 全州).csv”
[[1]] [1]“sic.1981.annual 16000(Idaho - Statewide).csv”
正如你所看到的,它在6之后重复,即使wage_data_files是长度为21的向量。
所以我的第一个问题是将所需的文件放入向量中。我的第二个问题是如何运行for循环读取这些文件,然后提取我想要的值。我遇到的问题是如何设置工作目录。因为,对于上述功能,工作目录是桌面。但是要使read.csv函数起作用,我必须将工作目录设置为每个单独的文件夹(例如“WageData / sic.1980.annual.by_area”,“WageData / sic.1981.annual.by_area”,等...)
有人有任何建议吗?
谢谢。
答案 0 :(得分:2)
它在'6'后重复的原因是你在每个循环中创建一个新的数据帧,导致删除任何现有数据。您需要在循环之前初始化数据框(或向量)。这是一个可能的实现,它也回答了你的第二个问题:
root_directory <- "~/Desktop/WageData"
toMatch <- c("Idaho -- Statewide", "Indiana -- Statewide", "Michigan -- Statewide",
"Oklahoma -- Statewide", "Texas -- Statewide", "Wisconsin -- Statewide")
folders <- list.files(root_directory, full.names = TRUE)
# initialize state_vector1 as an empty vector
states_vector1 <- c()
# loop over folders and get the full path of each file matching a pattern in the toMatch vector
for (folder in folders){
year_files <- list.files(folder)
# get the names of matching files, e.g. "Indiana -- Statewide.csv"
matches <- grep(paste(toMatch, collapse = "|"), year_files, value=TRUE)
# prepend the path to the directory to get the full path to each file
# to get e.g. "~/Desktop/WageData/sic.1980.annual.by.area/Wisconsin -- Statewide.csv"
matches <- vapply(matches, function(x) {file.path(folder, x)}, "", USE.NAMES = FALSE)
# append the new matches to states_vector1
states_vector1 <- c(states_vector1, matches)
}
# now you can loop over the vector containing the full path to each file
n_files <- length(states_vector1)
extracted_values <- rep(NA, n_files)
for (i in 1:n_files) {
file_content <- read.csv(states_vector1[i])
# create a function `extract_value()` which extracts the information you need from each file
extracted_values[i] <- extract_value(file_content)
}
通过设置以下目录结构来测试:
〜/桌面/ WageData / sic.1980.annual.by.area /
〜/桌面/ WageData / sic.1981.annual.by.area /
其中每个目录都包含所有六个csv文件,我得到以下输出:
> states_vector1
[1] "/Users/bene/Desktop/WageData/sic.1980.annual.by.area/Idaho -- Statewide.csv"
[2] "/Users/bene/Desktop/WageData/sic.1980.annual.by.area/Indiana -- Statewide.csv"
[3] "/Users/bene/Desktop/WageData/sic.1980.annual.by.area/Michigan -- Statewide.csv"
[4] "/Users/bene/Desktop/WageData/sic.1980.annual.by.area/Oklahoma -- Statewide.csv"
[5] "/Users/bene/Desktop/WageData/sic.1980.annual.by.area/Texas -- Statewide.csv"
[6] "/Users/bene/Desktop/WageData/sic.1980.annual.by.area/Wisconsin -- Statewide.csv"
[7] "/Users/bene/Desktop/WageData/sic.1981.annual.by.area/Idaho -- Statewide.csv"
[8] "/Users/bene/Desktop/WageData/sic.1981.annual.by.area/Indiana -- Statewide.csv"
[9] "/Users/bene/Desktop/WageData/sic.1981.annual.by.area/Michigan -- Statewide.csv"
[10] "/Users/bene/Desktop/WageData/sic.1981.annual.by.area/Oklahoma -- Statewide.csv"
[11] "/Users/bene/Desktop/WageData/sic.1981.annual.by.area/Texas -- Statewide.csv"
[12] "/Users/bene/Desktop/WageData/sic.1981.annual.by.area/Wisconsin -- Statewide.csv"
答案 1 :(得分:1)
你可以尝试这个(很难测试这是否有效)。您可以从Ids
获取完整路径名,这样您就可以将其用作list.files
的文件名。我将for循环转换为几个read.csv
循环
apply
这里,返回值(存储在## Doesn't need to be in loop
toMatch <- c("Idaho -- Statewide", "Indiana -- Statewide", "Michigan -- Statewide",
"Oklahoma -- Statewide", "Texas -- Statewide", "Wisconsin -- Statewide")
results <- lapply(wage_data_files, function(folder) {
year_files <- list.files(folder, full.names=T) # get full file names (w/ path)
states_vector1 <- grep(paste(toMatch, collapse = "|"), year_files, value=TRUE)
## Get a value from these files
sapply(states_vector1, function(fname) {
val <- read.csv(fname)[1,1] # get the first value
})
})
中)应该是向量列表。列表的每个元素都包含从其中一个年份文件夹中提取的结果。