如何使用lapply将新输出另存为单独的列表/未列出的对象?lapply、list、select

How to use lapply to save the new output as a seperate list/unlisted objects? lapply, list, select

提问人:LetsCode 提问时间:10/6/2023 更新时间:10/6/2023 访问量:33

问:

我正在尝试选择清理数据帧的特定行。我可以简单地通过对一个数据帧使用 select,然后对 x 数量重复代码来做到这一点,但这效率低下且不整洁。我认为 lapply 在这里是合适的。因此,我列出了 x 个数据帧,并且要选择的列名是select_vector。

我目前看来最好的方法是在列表中使用 lapply,将 select 作为函数,然后select_vector仅选择名称在向量中的列。

如何才能保存列表中的新帧?x <- x 没有覆盖原始帧,因此在我看来,代码中似乎是多余的。

我已经尝试了一些东西,但想使用 lapply,这样它就可以尽可能整洁地完成,并且我可以了解有关该功能的更多信息。

示例代码为:

df_list <- list(df1, df2, df3)

select_vector <- c("Country", "Year", "Description", "Value")

lapply(df_list, function(x) {x <- x %>% select(select_vector)} )

输出是具有所选列的帧,不幸的是,我无法将它们另存为新列表或不在列表对象中的帧。

谢谢。

r 列表 功能 选择 lapply

评论

0赞 doraemon 10/6/2023
lapply(df_list, function(x) {x <- x %>% select(select_vector)} ) %>% do.call(rbind,.)?

答:

0赞 Till 10/6/2023 #1
library(tidyverse)

您需要将 的输出分配给变量。lapply()

df_list_filtered <-
  lapply(df_list, function(x)
    x %>% select(all_of(select_vector)))

df_list_filtered
#> [[1]]
#> # A tibble: 10 × 4
#>    Country  Year Description Value
#>    <chr>   <int> <chr>       <chr>
#>  1 A        2002 A           a    
#>  2 B        2003 B           b    
#>  3 C        2004 C           c    
#>  4 D        2005 D           d    
#>  5 E        2006 E           e    
#>  6 F        2007 F           f    
#>  7 G        2008 G           g    
#>  8 H        2009 H           h    
#>  9 I        2010 I           i    
#> 10 J        2011 J           j    
#> 
#> [[2]]
#> # A tibble: 10 × 4
#>    Country  Year Description Value
#>    <chr>   <int> <chr>       <chr>
#>  1 A        2002 A           a    
#>  2 B        2003 B           b    
#>  3 C        2004 C           c    
#>  4 D        2005 D           d    
#>  5 E        2006 E           e    
#>  6 F        2007 F           f    
#>  7 G        2008 G           g    
#>  8 H        2009 H           h    
#>  9 I        2010 I           i    
#> 10 J        2011 J           j    
#> 
#> [[3]]
#> # A tibble: 10 × 4
#>    Country  Year Description Value
#>    <chr>   <int> <chr>       <chr>
#>  1 A        2002 A           a    
#>  2 B        2003 B           b    
#>  3 C        2004 C           c    
#>  4 D        2005 D           d    
#>  5 E        2006 E           e    
#>  6 F        2007 F           f    
#>  7 G        2008 G           g    
#>  8 H        2009 H           h    
#>  9 I        2010 I           i    
#> 10 J        2011 J           j

您可以稍微简化代码

df_list_filtered <-
  lapply(df_list, select, all_of(select_vector))

如果数据帧具有相同的列,则性能更高,也可能 在子集化之前,使它们更容易将它们绑定到单个 DataFrame 上 列。

df_list |>
  bind_rows(.id = "origin") |>
  select(origin, all_of(select_vector))
#> # A tibble: 30 × 5
#>    origin Country  Year Description Value
#>    <chr>  <chr>   <int> <chr>       <chr>
#>  1 1      A        2002 A           a    
#>  2 1      B        2003 B           b    
#>  3 1      C        2004 C           c    
#>  4 1      D        2005 D           d    
#>  5 1      E        2006 E           e    
#>  6 1      F        2007 F           f    
#>  7 1      G        2008 G           g    
#>  8 1      H        2009 H           h    
#>  9 1      I        2010 I           i    
#> 10 1      J        2011 J           j    
#> # ℹ 20 more rows

评论

0赞 LetsCode 10/9/2023
这很有帮助,谢谢。我有一件事,我不确定在使用bind_rows时是否可以避免。当我尝试将框架转换为宽框架以使列名包含描述时(以使其更容易绘制并消除对描述列的需要),生成的框架将保留 id 列,因此由于原点列,有很多不必要的行重复年份。有没有办法删除原点列?我可以不使用 .id = 吗?
0赞 Till 10/9/2023
如果不需要,可以省略该参数:..id... |> bind_rows()