【问题标题】:Repeat dataframe with new column in R使用 R 中的新列重复数据框
【发布时间】:2022-06-11 04:13:44
【问题描述】:

我有一个数据框:

my_df <- data.frame(var1 = c(1,2,3,4,5), var2 = c(6,7,8,9,10))
my_df
  var1 var2
1    1    6
2    2    7
3    3    8
4    4    9
5    5   10

我还有一个向量:

my_vec <- c("a", "b", "c")

我想重复数据帧length(my_vec) 次,用向量值填充新变量的值。有没有一种简单的方法可以做到这一点?如果可能的话,我想在 dplyr 链中执行此操作。期望的输出:

  var1 var2 var3
1    1    6    a
2    2    7    a
3    3    8    a
4    4    9    a
5    5   10    a
6    1    6    b
7    2    7    b
8    3    8    b
9    4    9    b
10   5   10    b
11   1    6    c
12   2    7    c
13   3    8    c
14   4    9    c
15   5   10    c

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用crossingexpand_grid

    library(tidyr)
    crossing(my_df, var3 = my_vec)
    #expand_grid(my_df, var3 = my_vec)
    

    如果顺序很重要,请使用arrange

    library(dplyr)
    crossing(my_df, var3 = my_vec) %>% 
        arrange(var3)
    

    -输出

    # A tibble: 15 × 3
        var1  var2 var3 
       <dbl> <dbl> <chr>
     1     1     6 a    
     2     2     7 a    
     3     3     8 a    
     4     4     9 a    
     5     5    10 a    
     6     1     6 b    
     7     2     7 b    
     8     3     8 b    
     9     4     9 b    
    10     5    10 b    
    11     1     6 c    
    12     2     7 c    
    13     3     8 c    
    14     4     9 c    
    15     5    10 c   
    

    【讨论】:

      【解决方案2】:

      虽然我认为这可能不是实践中最简单的答案,但我特别看到您想要一个可以解决此问题的 dplyr 链,因此我尝试在不使用预先存在的函数的情况下执行此操作这是给你的。
      对于您的示例,您可以将此链与 tibble 包函数 add_columnadd_row

      一起使用
      my_df %>%
        tibble::add_column(var3 = my_vec[1]) %>%
        tibble::add_row(tibble::add_column(my_df, var3 = my_vec[2])) %>%
        tibble::add_row(tibble::add_column(my_df, var3 = my_vec[3]))
      

      直接产生

        var1 var2 var3
      1     1    6    a
      2     2    7    a
      3     3    8    a
      4     4    9    a
      5     5   10    a
      6     1    6    b
      7     2    7    b
      8     3    8    b
      9     4    9    b
      10    5   10    b
      11    1    6    c
      12    2    7    c
      13    3    8    c
      14    4    9    c
      15    5   10    c
      
      虽然这个原理可以扩展一点,但它仍然可以更适应你想要应用它的任何东西。所以我决定做一个函数来为你做这件事。
      my_fxn <-
        function(frame, yourVector, new.col.name = paste0("var", NCOL(frame) + 1)) {
          require(tidyverse)
          origcols <- colnames(frame)
          for (i in 1:length(yourVector)) {
            intermediateFrame <- tibble::add_column(
              frame,
              temp.name = rep_len(yourVector[[i]], nrow(frame))
            )
            colnames(intermediateFrame) <- append(origcols, new.col.name)
            if (i == 1) {
              Frame3 <- intermediateFrame
            } else {
              Frame3 <- tibble::add_row(Frame3, intermediateFrame)
            }
          }
          return(Frame3)
        }
      

      运行my_fxn(my_df, my_vec) 应该会得到与我们在上面得到的相同的数据框/表。 我还尝试在函数外部单独使用for 循环来执行此操作,但我认为这样做有点过头了。不过,这种方法肯定也是可行的。

      【讨论】:

        猜你喜欢
        • 2021-10-04
        • 1970-01-01
        • 2015-07-07
        • 2017-10-17
        • 2021-08-12
        • 2020-12-18
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        相关资源
        最近更新 更多