我希望在R
中应用一个非常简单的功能
BasicFun <- function(x) {
c(min = min(x), max = max(x),
mean = mean(x))
}
对于在一组.csv
文件中始终存在的名为“值”的特定列,这些文件的名称非常相似(basedata10people.csv
,basedata20people.csv
等),这些名称遵循:
seq(10, 300, by=10)
所以我希望做类似的事情:
names <- seq(10, 300, by=10)
for (i in 1:names) {
{
file[[i]] = read.csv(file=paste("basedata", [[i]], "people", sep=""))
a=BasicFun(file[[i]]$Values)
results[[i]] = rbind(a)
}
allresults = rbindlist(results)
write.csv(allresults, file=paste("allresults.csv", sep=""))
}
为了将所有这些结果汇总到一个.csv
中,看起来应该像这样:
file min max mean
10 30 80 52
20 27 89 60
30 25 91 50
任何帮助或建议将不胜感激。
答案 0 :(得分:2)
我认为您可以无循环执行此操作。
首先,我设置一些虚拟数据并将其放在文件夹中:
list.files("~/Desktop/test_data")
[1] "basedata10people.csv" "basedata20people.csv" "basedata30people.csv"
[4] "not_csv.txt" "not_the_right_name.csv"
接下来,我们仅选择您想要的文件:
list.files("~/Desktop/test_data", "basedata\\d+.*?.csv")
[1] "basedata10people.csv" "basedata20people.csv" "basedata30people.csv"
然后,我们用文件设置一个数据框,嵌套数据,然后提取所需的值。
library(tidyverse)
data_frame(files = list.files("~/Desktop/test_data", "basedata\\d+.*?.csv")) %>%
mutate(files = paste0("~/Desktop/test_data/", files),
data = invoke_map(read_csv, files),
min = map(data, ~min(.x$value)),
max = map(data, ~max(.x$value)),
mean = map(data, ~mean(.x$value))) %>%
select(-data) %>%
unnest()
# files min max mean
# 1 ~/Desktop/test_data/basedata10people.csv 2 51 17.8
# 2 ~/Desktop/test_data/basedata20people.csv 2 51 18
# 3 ~/Desktop/test_data/basedata30people.csv 1 123 32.2
如果您想使用自己的功能,也可以这样做。
data_frame(files = list.files("~/Desktop/test_data", "basedata\\d+.*?.csv")) %>%
mutate(files = paste0("~/Desktop/test_data/", files),
data = invoke_map(read_csv, files),
vals = map(data, ~BasicFun(.x$value)))%>%
unnest(vals %>% map(broom::tidy)) %>%
spread(names, x)
# files max mean min
# 1 ~/Desktop/test_data/basedata10people.csv 51 17.8 2
# 2 ~/Desktop/test_data/basedata20people.csv 51 18 2
# 3 ~/Desktop/test_data/basedata30people.csv 123 32.2 1
更新:
在这里,我们将文件名更改为数字
data_frame(files = list.files("~/Desktop/test_data", "basedata\\d+.*?.csv")) %>%
mutate(files = paste0("~/Desktop/test_data/", files),
data = invoke_map(read_csv, files),
vals = map(data, ~BasicFun(.x$value)))%>%
unnest(vals %>% map(broom::tidy)) %>%
spread(names, x) %>%
mutate(files = as.numeric(str_extract(files, "(?<=basedata)\\d+(?=people)")))
# files max mean min
# 1 10 51 17.8 2
# 2 20 51 18 2
# 3 30 123 32.2 1