R-将功能应用于文件夹中具有for循环或lapply的两个文件,并将结果保存在一个数据帧中

如何解决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             ...       ...      ...
...

谢谢您的帮助!

解决方法

尝试此解决方案:

  1. 使用list.dirs获取所有文件夹。

  2. 对于每个文件夹,请读取“ alpha”和“ beta”文件,并返回三列带有alphabetaalphabeta值的小标题。

  3. 使用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")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?