簡體   English   中英

R 獲取新表

[英]R get new table

我有一個包含兩列 A 和 B 的表。我想創建一個添加了兩個新列的新表:X 和 Y。

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))

您可以使用dplyr across cross 和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))

更新了新數據和正確的代碼。 + 功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM