【问题标题】:Combining a list of data frames into a new data frame in R将数据框列表组合成R中的新数据框
【发布时间】:2022-01-15 19:27:56
【问题描述】:

这是对问题的第三次编辑(以防万一):

以下代码制作了一些示例数据框,选择标题中带有“_areaX”的数据框并列出它们。然后,目标是将列表中的数据框组合成 1 个数据框。它几乎可以工作......

Area1 <- 100
Area2 <- 200
Area3 <- 300
Zone <- 3

a1_areaX <- data.frame(Area1)
a2_areaX <- data.frame(Area2)
a3_areaX <- data.frame(Area3)
a_zoneX <- data.frame(Zone)

library(dplyr)   
pattern = "_areaX"
df_list <- mget(ls(envir = globalenv(), pattern = pattern))
big_data = bind_rows(df_list, .id = "FileName")

问题是新创建的数据框是这样的:

我需要它看起来像这样:

File Name Area measurement
a1_areaX 100
a2_areaX 200
a3_areaX 300

以下是我之前提出这个问题的尝试。从第一个版本编辑:

我将 csv 文件导入到 R Global Env 中,看起来像这样(我会分享实际文件,但这里似乎没有办法做到这一点):

它们都有一个名字,上面那个叫做“s6_section_area”。其中有很多(名称不同),我使用以下代码将它们全部放在一个列表中:

pattern = "section_area"
section_area_list <- list(mget(grep(pattern,ls(globalenv()), value = TRUE), globalenv()))

现在我想要一个看起来像这样的新数据框,将上面制作的列表中的数据框放在一起。

File Name Area measurement
a1_section_area a number
a2_section_area another number
many more more numbers

因此,第一列应列出原始文件的名称,第二列应列出该文件中提供的测量值。

希望这更清楚 - 不知道如何在不共享实际文件的情况下提供可重现的示例(这似乎不是一个选项)。

添加编辑:使用此代码

section_area_data <- bind_rows(section_area_list, .id = "FileName")

我明白了(它继续向右)

我正在寻找一个看起来像上面示例的表格,左列是文件名,文件名列表向下。右列是该文件名的测量值(取自原始文件)。

【问题讨论】:

  • 你可以使用bind_rows(section_area_list, .id = "s5_section_area")
  • 感谢您的建议。然而,“s5_section_area”只是我的大列表中的 1 个文件的名称。列表中文件的名称如下所示:“a1_section_area, a2_section_area...b1_section_area...” 其中有很多。我希望新数据框有一列列出所有文件名(例如“a1_section_area ...”),下一列列出面积测量值(由原始文件提供)。基本上我测量了某物的面积,每个测量值都保存在它自己的 cvs 文件中。现在我想将所有这些合并到一个大文档中。谢谢
  • 请考虑提供一个小的可重现示例和预期输出
  • 感谢您的评论。有没有办法将文件附加到这个线程?
  • .id 使用您应用的任何名称创建一个列,并将值作为list 的名称

标签: r list dataframe rows


【解决方案1】:

请注意,在您的数据框列表 (df_list) 中,所有列都有不同的名称(Area1Area2Area3),而在您的输出数据框中,它们都已合并为一列。因此,您需要将不同的列名称更改为相同的名称并将数据框绑定在一起。

library(dplyr)
library(purrr)

result <- map_df(df_list, ~.x %>% 
                  rename_with(~"Area", contains('Area')), .id = 'FileName')
result

#  FileName Area
#1 a1_areaX  100
#2 a2_areaX  200
#3 a3_areaX  300

【讨论】:

  • 谢谢@Ronak Shah。此定义适用于我的示例数据框。但是,让实际数据发挥作用仍然没有运气。我的列表中填充了 csv 文件,这些文件已导入 R Global Env,如果这有所不同的话。而且,csv 文件中的列名实际上都是相同的。
【解决方案2】:

感谢大家的建议。最后,我能够结合这些建议和更多的思考,想出了这个,效果很好。

library("dplyr")                   
                  
pattern = "section_area"
section_area_list <- mget(ls(envir = globalenv(), pattern = pattern))  
section_area_data <- bind_rows(section_area_list, .id = "FileName") %>%
    select(-V1) 

因此,将一堆 csv 文件导入 R Global Env。名称以“section_area”结尾的所有文件的列表已生成。这些文件被绑定到一个大数据框中,文件名作为一列,值(在本例中为面积测量)在另一列中(原始 csv 文件中有一个无意义的列,称为“V1”,我删除了它)。

这是众多 csv 文件之一的样子 sample csv file

这是最终数据框的布局(大约有 150 行) final data frame

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多