【问题标题】:Subtracting each column from its previous one in a data frame从数据框中的前一列中减去每一列
【发布时间】:2021-05-31 13:06:42
【问题描述】:

我在这里有一个非常简单的案例,我想从前一列中减去每一列。事实上,我正在寻找滑动减法,因为第一列保持原样,然后第一列减去第二列,第二列减去第三列,依此类推,直到最后一列。 这是我的示例数据集:

structure(list(x = c(1, 0, 0, 0), y = c(1, 0, 1, 1), z = c(0, 
1, 1, 1)), class = "data.frame", row.names = c(NA, -4L))

和我想要的输出:

structure(list(x = c(1, 0, 0, 0), y = c(0, 0, 1, 1), z = c(-1, 
1, 0, 0)), class = "data.frame", row.names = c(NA, -4L))

我个人正在寻找具有purrr 系列功能的解决方案。我也想过slider,但我对后者不太熟悉。因此,我将提前感谢这两个软件包的任何帮助和想法。非常感谢。

【问题讨论】:

    标签: r dplyr purrr


    【解决方案1】:

    一个简单的dplyr唯一的解决方案-

    • cur_data() 在 mutate/summarise 中只会创建一个完整的副本。所以
    • 只需从cur_data()[-1] 中减去cur_data()[-ncol(.)]
    • pmap_df 你可以做类似的事情
    df <- structure(list(x = c(1, 0, 0, 0), y = c(1, 0, 1, 1), z = c(0, 
                                                               1, 1, 1)), class = "data.frame", row.names = c(NA, -4L))
    
    
    library(dplyr)
    
    df %>% 
      mutate(cur_data()[-1] - cur_data()[-ncol(.)])
    #>   x y  z
    #> 1 1 0 -1
    #> 2 0 0  1
    #> 3 0 1  0
    #> 4 0 1  0
    

    类似

    pmap_dfr(df, ~c(c(...)[1], c(...)[-1] - c(...)[-ncol(df)]))
    

    【讨论】:

    • 非常漂亮和优雅。
    【解决方案2】:

    我认为您正在寻找 pmap_dflag 以减去以前的值。

    library(purrr)
    library(dplyr)
    
    pmap_df(df, ~{x <- c(...);x - lag(x, default = 0)})
    
    # A tibble: 4 x 3
    #      x     y     z
    #  <dbl> <dbl> <dbl>
    #1     1     0    -1
    #2     0     0     1
    #3     0     1     0
    #4     0     1     0
    

    【讨论】:

    • 非常感谢亲爱的 Ronak。在我最疯狂的梦想中,我无法想到这个简单而优雅的答案。
    【解决方案3】:

    冗长但简单:

    df %>%
      select(x) %>%
      bind_cols(df %>%
                 select(-1) %>%
                 map2_dfc(df %>%
                             select(-ncol(df)), ~.x -.y))
    
    #  x y  z
    #1 1 0 -1
    #2 0 0  1
    #3 0 1  0
    #4 0 1  0
    

    【讨论】:

    • 非常感谢您的回答。我真的很感谢你的帮助。这也太优雅了,可惜我只能选择一个,我很抱歉。
    【解决方案4】:

    我们可以做(不需要任何包)

    cbind(df1[1], df1[-1] - df1[-ncol(df1)])
    

    -输出

     x y  z
    1 1 0 -1
    2 0 0  1
    3 0 1  0
    4 0 1  0
    

    或使用dplyr

    library(dplyr)
    df1 %>%
          mutate(.[-1] - .[-ncol(.)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 2022-01-24
      • 2013-12-04
      • 1970-01-01
      相关资源
      最近更新 更多