如何解决R-将功能应用于文件夹中具有for循环或lapply的两个文件,并将结果保存在一个数据帧中
我在“数据”中有一个包含20个文件夹的数据集,它们的结构相同。文件夹级别的唯一区别是它们的名称(从“ 1”到“ 20”)。请参见下面的模式。这些文件始终具有相同的文件名和相同的列结构。文件夹之间的.csv
文件中的列长度可能有所不同,但同一文件夹中的.csv
文件之间却没有差异。数据帧中没有缺失值。我想使用文件中的“平均”列。
数据结构
data
- 1 (folder)
- alpha (file)
- mean (column)
- .... (more columns)
- beta (file)
- mean (column)
- .... (more columns)
- ... (more files)
- 2 (folder)
- alpha (file)
- mean (column)
- .... (more columns)
- beta (file)
- mean (column)
- .... (more columns)
- ... (more files)
- ... (more folders with the same structure)
我想比较一个文件夹中alpha的平均值和beta的平均值。但是最后,我希望有一个数据框,该数据框是所有单个文件夹的所有结果的子集。因此,我可以在此数据框中创建多面的箱形图和描述性统计信息。
我对R还是很陌生,显然缺乏R的技能(也为复杂的代码和我的英语感到抱歉)。我可以手动为每个文件夹执行任务,但是不能将结果与for循环或lapply解决方案放在一起。
我发现许多线程需要合并数据帧,而无需事先从同一文件夹中的两个文件执行功能。我希望我能提供一个可行的最小示例,其中包含来自2个文件夹的2个数据框。
library(plyr)
library(tidyverse)
alpha1 <- read_csv('data/1/alpha.csv')
beta1 <- read_csv('data/1/beta.csv')
alpha2 <- read_csv('data/2/alpha2.csv')
beta2 <- read_csv('data/2/beta2.csv')
文件夹1
alpha1 <- structure(list(Name = c("A","B","C","D","E","F","G","H","I","J","K"),mean = c(1,2,3,4,5,6,7,8,9,10,11)),class = c("spec_tbl_df","tbl_df","tbl","data.frame"),row.names = c(NA,-11L),spec = structure(list(
cols = list(Name = structure(list(),class = c("collector_character","collector")),mean = structure(list(),class = c("collector_double","collector"))),default = structure(list(),class = c("collector_guess",skip = 1),class = "col_spec"))
beta1 <- structure(list(Name = c("A",mean = c(2,11,12)),class = "col_spec"))
alpha_mean <- alpha1 %>% select(mean_alpha = mean)
alphabeta <- alpha_mean %>% add_column(mean_beta = beta1$mean)
alphabeta_table <- ddply(alphabeta,.(),transform,alphabeta = (mean_alpha/mean_beta))
alphabeta_table
.id mean_alpha mean_beta alphabeta
1 <NA> 1 2 0.5000000
2 <NA> 2 3 0.6666667
3 <NA> 3 4 0.7500000
4 <NA> 4 5 0.8000000
5 <NA> 5 6 0.8333333
6 <NA> 6 7 0.8571429
7 <NA> 7 8 0.8750000
8 <NA> 8 9 0.8888889
9 <NA> 9 10 0.9000000
10 <NA> 10 11 0.9090909
11 <NA> 11 12 0.9166667
文件夹2
alpha2 <- structure(list(Name = c("A","K","L","M"),12,13,14)),-13L),class = "col_spec"))
beta2 <- structure(list(Name = c("A",mean = c(3,14,15)),class = "col_spec"))
alpha2_mean <- alpha2 %>% select(mean_alpha = mean)
alphabeta2 <- alpha2_mean %>% add_column(mean_beta = beta2$mean)
alphabeta2_table <- ddply(alphabeta2,alphabeta = (mean_alpha/ mean_beta))
alphabeta2_table
.id mean_alpha mean_beta alphabeta
1 <NA> 2 3 0.6666667
2 <NA> 3 4 0.7500000
3 <NA> 4 5 0.8000000
4 <NA> 5 6 0.8333333
5 <NA> 6 7 0.8571429
6 <NA> 7 8 0.8750000
7 <NA> 8 9 0.8888889
8 <NA> 9 10 0.9000000
9 <NA> 10 11 0.9090909
10 <NA> 11 12 0.9166667
11 <NA> 12 13 0.9230769
12 <NA> 13 14 0.9285714
13 <NA> 14 15 0.9333333
所需的输出
我想要的输出是:
.id mean_alpha mean_beta alphabeta
1 1 1 2 0.5000000
2 1 2 3 0.6666667
3 1 3 4 0.7500000
4 1 4 5 0.8000000
5 1 5 6 0.8333333
6 1 6 7 0.8571429
7 1 7 8 0.8750000
8 1 8 9 0.8888889
9 1 9 10 0.9000000
10 1 10 11 0.9090909
11 1 11 12 0.9166667
1 2 2 3 0.6666667
2 2 3 4 0.7500000
3 2 4 5 0.8000000
4 2 5 6 0.8333333
5 2 6 7 0.8571429
6 2 7 8 0.8750000
7 2 8 9 0.8888889
8 2 9 10 0.9000000
9 2 10 11 0.9090909
10 2 11 12 0.9166667
11 2 12 13 0.9230769
12 2 13 14 0.9285714
13 2 14 15 0.9333333
1 3 ... ... ...
2 3 ... ... ...
...
谢谢您的帮助!
解决方法
尝试此解决方案:
-
使用
list.dirs
获取所有文件夹。 -
对于每个文件夹,请读取“ alpha”和“ beta”文件,并返回三列带有
alpha
,beta
和alphabeta
值的小标题。 -
使用
id
列绑定所有数据框,以了解每个值从哪个文件夹来。
all_folders <- list.dirs('Data/',recursive = FALSE,full.names = TRUE)
result <- purrr::map_df(all_folders,function(x) {
all_Files <- list.files(x,full.names = TRUE,pattern = 'alpha|beta')
df1 <- read.csv(all_Files[1])
df2 <- read.csv(all_Files[2])
tibble::tibble(alpha = df1$mean,beta = df2$mean,alphabeta = alpha/beta)
},.id = "id")