我希望在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
任何帮助或建议将不胜感激。
我认为你可以在没有任何循环的情况下做到这一点。
首先,我设置了一些虚拟数据并将其放在一个文件夹中:
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