代码之家  ›  专栏  ›  技术社区  ›  Tdebeus

添加每个元素的名称作为值的新列

  •  0
  • Tdebeus  · 技术社区  · 7 年前

    我在列表中有一堆数据帧。我正在尝试向每个数据帧添加一个新列,并将数据帧的“name”作为一个值。

    library(tidyverse)
    
    df_2018 <- data_frame(y1 = c(1, 2, 3),
                          y2 = c(4, 5, 6))
    df_2017 <- data_frame(y1 = c(3, 2, 1),
                          y2 = c(6, 5, 4))
    
    list <- list(df_2017 = df_2017, df_2018 = df_2018)
    

    结果:

    > list
    $df_2017
    # A tibble: 3 x 2
         y1    y2
      <dbl> <dbl>
    1     3     6
    2     2     5
    3     1     4
    
    $df_2018
    # A tibble: 3 x 2
         y1    y2
      <dbl> <dbl>
    1     1     4
    2     2     5
    3     3     6
    

    预期结果:

    > list
    $df_2017
    # A tibble: 3 x 3
         y1    y2 year   
      <dbl> <dbl> <chr>  
    1     3     6 df_2017
    2     2     5 df_2017
    3     1     4 df_2017
    
    $df_2018
    # A tibble: 3 x 3
         y1    y2 year   
      <dbl> <dbl> <chr>  
    1     1     4 df_2018
    2     2     5 df_2018
    3     3     6 df_2018
    

    purrr map() 函数,所以如果你能用purrr显示一个答案,额外的分数!

    我在想以下几点,但这行不通:

    map(list,
        add_column,
        ~ year = names(.x))
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   YOLO    7 年前

    我会用 map2 mutate 为此:

    library(dplyr)
    library(purrr)
    
    mlist <- list(df_2017 = df_2017, df_2018 = df_2018)
    
    map2(mlist, names(mlist), ~ mutate(.x, year = .y)) 
    
    $df_2017
      y1 y2    year
    1  3  6 df_2017
    2  2  5 df_2017
    3  1  4 df_2017
    
    $df_2018
      y1 y2    year
    1  1  4 df_2018
    2  2  5 df_2018
    3  3  6 df_2018
    
        2
  •  1
  •   phiver    7 年前

    我们把名单和名单上的名字,用 map2 来自purrr和 add_column 从tibble到把所有的东西结合起来。

    map2(list, names(list), function(x, y) add_column(x, year = y))
    
    $`df_2017`
    # A tibble: 3 x 3
         y1    y2 year   
      <dbl> <dbl> <chr>  
    1     3     6 df_2017
    2     2     5 df_2017
    3     1     4 df_2017
    
    $df_2018
    # A tibble: 3 x 3
         y1    y2 year   
      <dbl> <dbl> <chr>  
    1     1     4 df_2018
    2     2     5 df_2018
    3     3     6 df_2018
    
        3
  •  1
  •   Chriss Paul    7 年前

    base 解决方案使用 lapply

    lst <- list(df_2017 = df_2017, df_2018 = df_2018) #I'm using lst as name instead of "list" as it is reserved in R
    temp <- lapply(seq_along(lst), function(x) rep(names(lst[x]), times = nrow(lst[[x]])))
    lapply(seq_along(lst), function(i) cbind(lst[[i]], year=temp[[i]]))
    #returns
    [[1]]
      y1 y2    year
    1  3  6 df_2017
    2  2  5 df_2017
    3  1  4 df_2017
    
    [[2]]
      y1 y2    year
    1  1  4 df_2018
    2  2  5 df_2018
    3  3  6 df_2018
    

    Map

    Map("[<-", lst, "year", value = names(lst))