Select R 中多个数据帧的函数

Select function for multiple data frames in R

我有 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"

我想要 select 以“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.

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

非常感谢!

你可以试试purrrmap功能

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

未经测试的代码

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"))
      )
  }
)

对于您的 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))])