【问题标题】:create new column using differences of rows使用行的差异创建新列
【发布时间】:2020-03-12 04:56:58
【问题描述】:

我有一个如下数据集。

如何使用 A 中具有匹配 ID 的值的差异来创建新列 B。抱歉,如果以前有人问过这个问题。谢谢

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    使用dplyr,我们可以将group_byID 减去firstlastA 值。

    library(dplyr)
    
    df %>%
     group_by(ID) %>%
     summarise(B = first(A) - last(A), A = first(A)) %>%
     select(names(df), B)
    
    # A tibble: 4 x 3
    #  ID        A     B
    #  <fct> <dbl> <dbl>
    #1 aa        2    -1
    #2 bb        4     0
    #3 cc        3     1
    #4 dd        1     0
    

    数据

    df <- structure(list(ID = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L
    ), .Label = c("aa", "bb", "cc", "dd"), class = "factor"), A = c(2, 
    4, 3, 1, 3, 4, 2, 1)), class = "data.frame", row.names = c(NA, -8L))
    

    【讨论】:

      【解决方案2】:

      我们可以使用data.table 方法

      library(data.table)
      setDT(df)[, .(B = first(A) - last(A), A = first(A)), .(ID)]
      
      数据
      df <- structure(list(ID = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L
      ), .Label = c("aa", "bb", "cc", "dd"), class = "factor"), A = c(2, 
      4, 3, 1, 3, 4, 2, 1)), class = "data.frame", row.names = c(NA, -8L))
      

      【讨论】:

        【解决方案3】:

        另一种方法是旋转表格,使两个“A”值位于不同的列中。

        library(tidyverse)
        
        df %>% 
          mutate(name = if_else(duplicated(ID), "A_additional", "A")) %>% 
          pivot_wider(id_cols = ID, values_from = A, names_from = name) %>% 
          mutate(B = A - A_additional)
        
        # # A tibble: 4 x 4
        #   ID        A A_additional     B
        #   <fct> <dbl>        <dbl> <dbl>
        # 1 aa        2            3    -1
        # 2 bb        4            4     0
        # 3 cc        3            2     1
        # 4 dd        1            1     0
        

        此解决方案不需要分组,因此可以很好地扩展到更大的数据集。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-10
          • 1970-01-01
          • 1970-01-01
          • 2020-11-19
          • 2021-08-04
          相关资源
          最近更新 更多