【问题标题】:Select function for multiple data frames in RR中多个数据帧的选择函数
【发布时间】:2020-11-06 03:19:00
【问题描述】:

我有 9 个数据框,我想从它们中提取相同的列,所以其中一个看起来像这样:

    > str(ess2002)
tibble [39,334 × 566] (S3: tbl_df/tbl/data.frame)
 $ name    : chr [1:39334] "ESS1e06_6" "ESS1e06_6" "ESS1e06_6" "ESS1e06_6" ...
  ..- attr(*, "label")= chr "Title of dataset"
  ..- attr(*, "format.stata")= chr "%9s"
 $ essround: num [1:39334] 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "label")= chr "ESS round"
  ..- attr(*, "format.stata")= chr "%12.0g"
 $ edition : chr [1:39334] "6.6" "6.6" "6.6" "6.6" ...
  ..- attr(*, "label")= chr "Edition"
  ..- attr(*, "format.stata")= chr "%3s"
 $ proddate: chr [1:39334] "01.12.2018" "01.12.2018" "01.12.2018" "01.12.2018" ...
  ..- attr(*, "label")= chr "Production date"
  ..- attr(*, "format.stata")= chr "%10s"
 $ cntry   : chr [1:39334] "AT" "AT" "AT" "AT" ...
  ..- attr(*, "label")= chr "Country"
  ..- attr(*, "format.stata")= chr "%2s"
 $ idno    : num [1:39334] 1 2 3 4 6 7 8 10 12 14 ...
  ..- attr(*, "label")= chr "Respondent's identification number"
  ..- attr(*, "format.stata")= chr "%12.0g"

我想选择以“prtvt”开头的变量,包含“IM”、“QFIM”或“RFG”的变量。并为九个数据帧中的每一个做到这一点。 我尝试创建一个包含所有数据框的列表并使用 select 函数运行 lapply,如下所示:

df.list <- list(ess2002,ess2004,ess2006,ess2008,
            ess2010,ess2012,ess2014,ess2016, ess2018)
lapply(df.list, select(starts_with("prtvt") | contain(c("IM", "QFIM", "RFG"))))

但我收到以下错误:

Error: `starts_with()` must be used within a *selecting* function.

有人知道如何解决这个问题吗?

非常感谢!

【问题讨论】:

    标签: r loops dplyr tidyverse lapply


    【解决方案1】:

    你可以试试purrrmap函数

    library(tidyverse)
    df.list %>% 
      map(., ~select(.,starts_with("prtvt") | contains(c("IM", "QFIM","RFG"))))
    

    【讨论】:

      【解决方案2】:

      未经测试的代码

      df.list <- list(ess2002,ess2004,ess2006,ess2008,
                  ess2010,ess2012,ess2014,ess2016, ess2018)
      lapply(
        1:length(df.list), 
        function(x) {
          df.list[[x]] %>% 
            select(
              starts_with("prtvt"), 
              contains(c("IM", "QFIM", "RFG"))
            )
        }
      )
      

      【讨论】:

        【解决方案3】:

        对于您的lapply() 语句,您需要在lapply() 中使用匿名函数,或者不使用括号并为select() 提供参数。

        匿名函数

        这里df--在匿名函数中声明--代表df.list的每个元素

        lapply(df.list, function(df) select(df, starts_with("prtvt"), contains(c("IM", "QFIM", "RFG"))))
        
        # or lapply(df.list, function(x) select(x, starts_with("prtvt"), contains(c("IM", "QFIM", "RFG"))))
        

        为您的函数提供参数 (select())

        这里函数的第一个非命名参数是df.list 的每个元素。在这种情况下,df.list 的每个元素都位于select() 的第一个位置:

        lapply(df.list, select, starts_with("prtvt"), contains(c("IM", "QFIM", "RFG")))
        

        或者,如果您更喜欢 base R 解决方案,您可以使用这个:

        lapply(df.list, function(x) x[startsWith(names(x), "prtvt") | grepl("IM|QFIM|RFG", names(x))])
        
        # or lapply(df.list, function(x) x[grepl("^prtvt|IM|QFIM|RFG)", names(x))])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-09
          • 1970-01-01
          • 2020-02-18
          • 2021-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多