【问题标题】:Extract data frames from list and name them从列表中提取数据框并命名
【发布时间】:2021-06-25 12:18:27
【问题描述】:

我有一个数据框列表,其中包含几个位置的日平均温度。每个数据帧长 360-365 个条目,看起来像这样

Airport Day Average
RJOO 1998-01-01 12

我从几个数据集制作了这个列表,这样我就可以一次对它们进行计算,就像

weathers<-list(France, Greece)

我希望能够将它们拉出来并将它们保存为新文件。在这种情况下,这意味着有两个名为法国和希腊。我能做的最多就是在每个条目中创建一个包含名称的新列。

【问题讨论】:

  • 我不清楚你的目标是什么。您使用 weathers&lt;-c(France, Greece) 创建了一个数据框列表,现在您想从 weathers 中提取数据框?

标签: r list dataframe


【解决方案1】:

这里发生了几件事。如果您提供可重现的示例并让我们知道哪里出了问题,您可以找到很多朋友。 以下是基于{tidyverse} 的方法。它适用于为您的每个国家/地区创建一个嵌套表。 我希望它能把你带到你想去的地方,并且你可以适应你的问题。

1.) 开始 作为第一个练习,将您的各种数据框绑定成一个大数据框。我模拟一些数据来建立一个数据框。如果这对您来说已经是一个问题,请阅读如何执行此操作。

library(tidyverse)
set.seed(666) # set seed and simulate data ---------------------------------
Airport <- rep(c("RJOO","LFPG","EHAM"), 5)
Day <- sample(c( as.POSIXct("1998-01-01")
                 ,as.POSIXct("1998-01-02")
                 ,as.POSIXct("1998-01-03") ), 15, replace = TRUE)
Average <- sample(c(12:25), 15, replace = TRUE)

df <- tibble(Airport, Day, Average)

这会产生:

df
# A tibble: 15 x 3
   Airport Day                 Average
   <chr>   <dttm>                <int>
 1 RJOO    1998-01-02 00:00:00      19
 2 LFPG    1998-01-02 00:00:00      18
 3 EHAM    1998-01-03 00:00:00      13
 4 RJOO    1998-01-03 00:00:00      12
 5 LFPG    1998-01-02 00:00:00      21
 6 EHAM    1998-01-01 00:00:00      17
 7 RJOO    1998-01-01 00:00:00      19
 8 LFPG    1998-01-01 00:00:00      20
 9 EHAM    1998-01-02 00:00:00      15
10 RJOO    1998-01-03 00:00:00      22
11 LFPG    1998-01-01 00:00:00      24
12 EHAM    1998-01-01 00:00:00      19
13 RJOO    1998-01-03 00:00:00      21
14 LFPG    1998-01-03 00:00:00      19
15 EHAM    1998-01-02 00:00:00      18

2.) 关联国家/地区名称从您的示例中不清楚您如何关联国家/地区名称。我假设你知道你的方式。机场国际民航组织位置指示器(基本上是第一个或前 2 个字母)为您提供国家/地区。如果您有查找表,则可以将位置指示符(4 字母代码,RJOO)与国家/地区合并。您可以将查找表与{dplyr}left_join() 合并。

因为懒惰,我使用case_when() 继续前进。显然,您可能必须以不同的方式执行此操作。

# associate country names with data
df <- df %>% 
  mutate(Country = case_when(    # a lazy look up for country name creation -----
                  Airport == "RJOO" ~ "Japan"
                , Airport == "LFPG" ~ "France"
                , Airport == "EHAM" ~ "Netherlands"
                , TRUE ~ as.character(NA) )
   ) #----------------------------------------------------------------------------

你知道有以下几点:

# A tibble: 15 x 4
   Airport Day                 Average Country    
   <chr>   <dttm>                <int> <chr>      
 1 RJOO    1998-01-02 00:00:00      19 Japan      
 2 LFPG    1998-01-02 00:00:00      18 France     
 3 EHAM    1998-01-03 00:00:00      13 Netherlands
 4 RJOO    1998-01-03 00:00:00      12 Japan      
 5 LFPG    1998-01-02 00:00:00      21 France     
 6 EHAM    1998-01-01 00:00:00      17 Netherlands
 7 RJOO    1998-01-01 00:00:00      19 Japan      
 8 LFPG    1998-01-01 00:00:00      20 France     
 9 EHAM    1998-01-02 00:00:00      15 Netherlands
10 RJOO    1998-01-03 00:00:00      22 Japan      
11 LFPG    1998-01-01 00:00:00      24 France     
12 EHAM    1998-01-01 00:00:00      19 Netherlands
13 RJOO    1998-01-03 00:00:00      21 Japan      
14 LFPG    1998-01-03 00:00:00      19 France     
15 EHAM    1998-01-02 00:00:00      18 Netherlands

3.) 嵌套数据框 嵌套数据框的创建非常简单。

df <- df %>% group_by(Country) %>% nest()
df
# A tibble: 3 x 2
# Groups:   Country [3]
  Country     data            
  <chr>       <list>          
1 Japan       <tibble [5 x 3]>
2 France      <tibble [5 x 3]>
3 Netherlands <tibble [5 x 3]>

4.) 使用嵌套表格写出部分 首先,我们创建一个函数来帮助我们写出数据框/tibble 的国家/地区部分。

# utility function to write out country parts
write_country <- function(.ctry, .data){
  fn <- paste0(.ctry, ".csv")   # construct a filename to your liking
  readr::write_csv(.data, fn) 
}

# as we write out and the function does not return
# we use purrr's walk instead of map to iterate over the nested data
walk2( .x = df$Country       # you have 2 variables, thus use walk2
     , .y = df$data          # define .x and .y vector
     , .f = ~ write_country(.x, .y)  # supply your function, watch the tilde ~
)

# you will now see 3 csv files: Japan.csv, France.csv, and Netherlands.csv

这个食谱应该适合你。 只需确保定义文件名,同时考虑文件夹结构和保存位置等。

【讨论】:

    【解决方案2】:

    我做了以下事情: 我有一个最初用于导入未编辑 CSV 的文件名的列表。

    filenames <- gsub("\\.csv$","", list.files(pattern="\\.csv$")) 
    for(i in filenames){
    assign(i, read.csv(paste(i, ".csv", sep="")))
    }
    

    如果你以不同的方式导入它们,比如

    filenames<-c("France", "Greece")
    
    airport="LFMD"
    days=as.Date("1988-2-15")
    temperature=3
    France<-data.frame(airport,days,temperature)
    
    
    airport2="LGEL"
    days2=as.Date("1994-1-11")
    temperature2=15
    Greece<-data.frame(airport2,days2,temperature2)
    
    mylist<-list(France, Greece)
    

    通过几个函数后,为了将编辑的保存到文件中

        for(i in 1:length(filenames)){
      write.csv(mylist[[i]], file = paste0("D:/Weather/Modified/", filenames[i],".csv"), row.names = TRUE)
    }
    

    这为我提供了具有我想要的名称的保存文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      • 2021-07-19
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      相关资源
      最近更新 更多