【问题标题】:How to create a variable that indicate where the data from in every list elements in r如何创建一个变量来指示数据在 r 中的每个列表元素中的位置
【发布时间】:2025-11-21 09:25:01
【问题描述】:

我的问题是我在标题中所说的,我发现 Duck 的问题和我的一样 (How to create in R new variable for each element in a list of data frames with the name of data frame and its value equal to position of the element)。

在我对 R 的了解不足的情况下,虽然它确实得到了我想要的,但我无法很好地理解代码。

我知道我的代码无法运行,但我认为代码应该是这样的:

# create a fake data
df1 <- split(mtcars,mtcars$cyl)

# add a new variable that indicate where the element from in the list with the element name
df2 <- map(df1, mutate(from = names(df1)))

任何帮助将不胜感激!

【问题讨论】:

    标签: r list dplyr tidyverse


    【解决方案1】:

    您可以使用purrr 中的imap 将列表名称包含为新列

    purrr::imap(df1, ~dplyr::mutate(.x, from = .y))
    
    #$`4`
    #    mpg cyl  disp  hp drat    wt  qsec vs am gear carb from
    #1  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1    4
    #2  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2    4
    #3  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2    4
    #4  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1    4
    #5  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2    4
    #6  33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1    4
    #7  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1    4
    #8  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1    4
    #9  26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2    4
    #10 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2    4
    #11 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2    4
    
    #$`6`
    #   mpg cyl  disp  hp drat    wt  qsec vs am gear carb from
    #1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4    6
    #2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    6
    #3 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1    6
    #....
    

    在基础 R 中,我们可以使用 Map

    Map(cbind, df1, from = names(df1))
    #Same as 
    #purrr::map2(df1, names(df1), cbind)
    

    【讨论】:

    • 我不知道问题是“如何做到这一点?”或“为什么我的代码没有成功?”我想知道 OP 是否知道 Map 和 map 是不同的功能。
    • 我也不知道。但看看他们的尝试,我想这就是他们正在尝试的。
    • @RonakShah 非常感谢,这正是我所需要的,我会进一步了解Mapimap
    • @RonakShah 还有一个小问题。 Map(cbind, df1, from = names(df1)) 创建的 from 变量是一个因素。我尝试将其转换为字符但失败了。 df4 &lt;- df3 %&gt;% map_if(is.factor,as.character).
    • @zhiweili 使用mutate_if 代替df4 &lt;- df3 %&gt;% mutate_if(is.factor,as.character)
    【解决方案2】:

    另一个基本 R 选项:

    split(transform(mtcars, from=cyl), mtcars$cyl)
    

    【讨论】:

      【解决方案3】:

      我们可以在base R 中使用transformMap

      Map(transform, df1, from = names(df1))
      

      【讨论】: