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.
有谁知道如何解决这个问题?
非常感谢!
你可以试试purrr
的map
功能
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))])
我有 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.
有谁知道如何解决这个问题?
非常感谢!
你可以试试purrr
的map
功能
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))])