提问人:LetsCode 提问时间:10/6/2023 更新时间:10/6/2023 访问量:33
如何使用lapply将新输出另存为单独的列表/未列出的对象?lapply、list、select
How to use lapply to save the new output as a seperate list/unlisted objects? lapply, list, select
问:
我正在尝试选择清理数据帧的特定行。我可以简单地通过对一个数据帧使用 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)} )
输出是具有所选列的帧,不幸的是,我无法将它们另存为新列表或不在列表对象中的帧。
谢谢。
答:
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()
评论