r语言 - 将函数应用于一组具有相似名称的.csv



我希望在R中应用一个非常简单的函数

BasicFun <- function(x) {
  c(min = min(x), max = max(x), 
    mean = mean(x))
}

对于始终存在于一组.csv文件中的名为"值"的特定列,所有文件的名称都非常相似(basedata10people.csvbasedata20people.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

最新更新