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

R获取新表

  •  0
  • D_K  · 技术社区  · 3 年前

    X列包含A列中的值,但执行除法。第一行(来自A列)的值除以A列第二行的值,对于所有后续行,如第三行除以第四行等。

    Y列包含B列中的值,但执行除法。第一行(来自B列)的值除以B列第二行的值,因此对于所有后续行,例如第三行除以第四行等。

    到目前为止,我使用了Excel。但是现在,如果可能的话,我需要在R中以函数的形式使用它,这样我就可以轻松地重用这些代码。我还没有在R中这样做,所以我请求帮助。

    示例数据:

       structure(list(A = c(2L, 7L, 5L, 11L, 54L, 12L, 34L, 14L, 10L, 
    6L), B = c(3L, 5L, 1L, 21L, 67L, 32L, 19L, 24L, 44L, 37L)), class = "data.frame", row.names = c(NA, 
    -10L))
    

    样本结果:

    structure(list(A = c(2L, 7L, 5L, 11L, 54L, 12L, 34L, 14L, 10L, 
    6L), B = c(3L, 5L, 1L, 21L, 67L, 32L, 19L, 24L, 44L, 37L), X = c("", 
    "0,285714286", "", "0,454545455", "", "4,5", "", "2,428571429", 
    "", "1,666666667"), Y = c("", "0,6", "", "0,047619048", "", "2,09375", 
    "", "0,791666667", "", "1,189189189")), class = "data.frame", row.names = c(NA, 
    -10L))
    
    1 回复  |  直到 3 年前
        1
  •  0
  •   harre    3 年前

    你可以用 dplyr across lag (与每第二行拾取的模结合):

    library(dplyr)
    
    df |> mutate(across(c(A, B), ~ ifelse(row_number() %% 2 == 0, lag(.) / ., NA), .names = "new_{.col}"))
    

    NA "" .

    输出:

        A  B     new_A      new_B
    1   2  3        NA         NA
    2   7  5 0.2857143 0.60000000
    3   5  1        NA         NA
    4  11 21 0.4545455 0.04761905
    5  54 67        NA         NA
    6  12 32 4.5000000 2.09375000
    7  34 19        NA         NA
    8  14 24 2.4285714 0.79166667
    9  10 44        NA         NA
    10  6 37 1.6666667 1.18918919
    

    ab_fun <- function(data, vars) { 
      
      data |> 
        mutate(across(c(A, B), ~ ifelse(row_number() %% 2 == 0, lag(.) / ., NA), .names = "new_{.col}"))
      
    }
    
    ab_fun(df, c(A,B))