将先前的列表元素传递给 R 中的新列表元素

Pass previous list element to new list element in R

我有几个有序变量和因子变量的数据框。我想从有序变量创建一个新的数字变量数据框。我希望将所有数据帧存储在分层列表结构中。

我想知道是否有一种简单的一步法来使用列表元素创建下一个元素?

生成所需输出的两步法的可重现示例:

library(dplyr)

# Step 1: Create list with first element
my_list <- list(
    ord = data.frame(
        a1 = letters[1:3],
        a2 = ordered(1:3)
    )
)

# Step 2: Add second element
my_list$cont <- mutate(
    my_list$ord, # I want to use the previous list element "ord" to create the next
    across(-a1, as.numeric)
)

# The desired output:
my_list

> $ord
     A data.frame: 3 × 2
     a1    a2
     <chr> <ord>
     a     1
     b     2
     c     3
> $cont
     A data.frame: 3 × 2
     a1    a2
     <chr> <dbl>
     a     1
     b     2
     c     3

上面的工作示例看起来很先进,但是通过这种方式添加更多列表项和对数据框的更多操作,它很快就会变得更加复杂。

这就是为什么我想知道是否有更简单的方法,例如在创建列表时将上一个列表项传递给下一个列表项。下面是我想要实现的一步法的伪代码示例:

library(dplyr)

my_list <- list(
    ord = data.frame(
        a1 = letters[1:3],
        a2 = ordered(1:3)
    ),
    cont = mutate(
        my_list$ord, # I want to use the previous list element "ord" to create the next
        across(-a1, as.numeric)
    )
)

my_list

根据 lhs' 的评论,使用 lst() 而不是 list() 创建列表的解决方案实际上相当简单。 来自 lst() 的 R 帮助页面:"lst() 按顺序构建组件。定义组件时,您可以参考调用之前创建的组件。"

工作代码示例:

library(dplyr) # (Imported from "tibble")

my_list <- lst(
    ord = data.frame(
        a1 = letters[1:3],
        a2 = ordered(1:3)
    ),
    cont = mutate(
        ord, # Using previous list component 
        across(-a1, as.numeric)
    )
)

my_list