【问题标题】:R - Add a new ID for each data frame within a list (using apply or dplyr)R - 为列表中的每个数据框添加一个新 ID(使用 apply 或 dplyr)
【发布时间】:2018-12-08 00:09:59
【问题描述】:

对于每个数据框,我想要一个唯一的标识符。我已经可以使用 for 循环来做到这一点,但我正试图让我的代码更像 R,我觉得这可以通过 apply 函数或 dplyr 来完成。我当前的代码示例:

df1 <- data.frame(x="ayyy", y=rnorm(5))
df2 <- data.frame(x="lmao", y=rnorm(6))
l1 <- list(df1,df2)

for (i in seq_along(l1)){
  l1[[i]] <- cbind(l1[[i]],i)
}


l1

我也很欣赏实现这一目标的其他方法。

【问题讨论】:

    标签: r list dataframe dplyr apply


    【解决方案1】:

    使用mapply

    mapply(cbind, l1, "i" = seq_along(l1), SIMPLIFY = F)

    输出:

    [[1]]
         x           y i
    1 ayyy  1.52049119 1
    2 ayyy  0.79595595 1
    3 ayyy -1.45352957 1
    4 ayyy  0.09839542 1
    5 ayyy -0.59377098 1
    
    [[2]]
         x           y i
    1 lmao  0.88828117 2
    2 lmao  0.05307042 2
    3 lmao -0.55702363 2
    4 lmao  0.43839704 2
    5 lmao  0.15260816 2
    6 lmao -0.16461758 2
    

    【讨论】:

      【解决方案2】:

      您可以为此使用purrr::imap,它将列表中每个元素的索引作为第二个参数.y 传递给函数:

      library(purrr); library(dplyr)
      
      imap(l1, ~ mutate(.x, i = .y))
      
      #[[1]]
      #     x         y i
      #1 ayyy -1.761054 1
      #2 ayyy -2.123735 1
      #3 ayyy -1.525554 1
      #4 ayyy -1.756684 1
      #5 ayyy -1.686749 1
      
      #[[2]]
      #     x           y i
      #1 lmao  0.05505287 2
      #2 lmao -0.33393283 2
      #3 lmao -1.91543274 2
      #4 lmao -1.03591717 2
      #5 lmao  0.67857511 2
      #6 lmao  0.61049477 2
      

      这相当于使用Map 的基本 R 解决方案:

      Map(function(.x, .y) mutate(.x, i = .y), l1, seq_along(l1))
      

      注意lapplyapply 在循环遍历每个元素时无法跟踪它们的索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-30
        • 2021-07-28
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多