簡體   English   中英

如何在數據框(矩陣)中包含新的行和列,並在 R 的數據集中基於這些執行數學運算

[英]How to include new rows and columns in a data frame (matrix) and perform a mathematical operation based on these in the dataset in R

我是 R 的新手,我在分析數據集時遇到了問題。

我有一個這樣的數據集。 它實際上是生物學中的階乘交叉結果(Aa、Ab、Ac、...、Ba、Bb、Bc 等)。 A、B、C、D、E、F 和 a、b、c、d 有自己的值,我在下面的代碼中寫下了這些值。 我想在主數據集中的每個單元格上應用一個公式。 方程在代碼中[(X-(Xi + Yj/2)/(Xi + Yj/2)*100] (我只嘗試了一個單元格作為示例;我不知道如何執行方程所有數據集)。這些值是否應該在數據集中的新行和列中?我想在執行方程式后為新的單元格值着色。比方說,根據值(60-80],(80-100 ], (100-120], (120-140]. 你介意在這方面指導我嗎?

a <- c(103, 110, 105, 108, 101, 100)
b <- c(105, 108, 121, 96, 110, 100)
c <- c(106, 110, 110, 113, 118, 107)
d <- c(103, 115, 105, 113, 98, 100)
data <- data.frame(a, b, c, d)
rownames(data) <- c("A", "B", "C", "D", "E", "F")
data
#>     a   b   c   d
#> A 103 105 106 103
#> B 110 108 110 115
#> C 105 121 110 105
#> D 108  96 113 113
#> E 101 110 118  98
#> F 100 100 107 100

X_i <- c("A" = 60, "B" = 57, "C" = 62, "D" = 57, "E" = 60, "F" = 57)
Y_j <- c("a" = 60, "b" = 40, "c" = 63, "d" = 45)
df <- ((data[1, 1] - ((A + a)/2))/ (A + a)/2)*100
#> Error in eval(expr, envir, enclos): object 'A' not found

代表 package (v2.0.0) 於 2021 年 4 月 27 日創建

如果您使用矩陣,這會更簡單:

Xi <- matrix(X_i, nrow=length(X_i), ncol=(length(Y_j)))
Yj <- matrix(Y_j, nrow=length(X_i), ncol=(length(Y_j)), byrow=TRUE)
result <- (data - (Xi + Yj)/2) / (Xi + Yj)/2 * 100
result
#          a        b        c        d
# 1 17.91667 27.50000 18.08943 24.04762
# 2 22.00855 30.67010 20.83333 31.37255
# 3 18.03279 34.31373 19.00000 24.06542
# 4 21.15385 24.48454 22.08333 30.39216
# 5 17.08333 30.00000 22.96748 21.66667
# 6 17.73504 26.54639 19.58333 24.01961

這是另一種解決方案,但我相信上面提出的矩陣解決方案更簡單、更直接。 在這里,我們使用purrr package 的pmap函數在逐行操作中一次迭代 3 個 arguments。 請注意,我們從您的X_iY_j向量中創建了另外 2 個數據框,與原始數據框的維度相同。 然后我使用pmap function 進行算術運算。 首先,我將所有三個數據集收集在一個列表中,並且在公式部分..1 、 ..2 ..3 ..2中每個都指同一行中每個數據集的相應元素,因為我們正在執行 row_wise 操作並且所有三個數據集都具有相同的維度。

library(purrr)

df1 <- as.data.frame(matrix(X_i, nrow = length(X_i), ncol = length(Y_j)))
df2 <- as.data.frame(matrix(Y_j, nrow = length(X_i), ncol = length(Y_j), byrow = TRUE))


pmap_dfr(list(data, df1, df2), ~ (..1 - (..2 + ..3)/2) / (..2 + ..3)/2 * 100)


# A tibble: 6 x 4
      a     b     c     d
  <dbl> <dbl> <dbl> <dbl>
1  17.9  27.5  18.1  24.0
2  22.0  30.7  20.8  31.4
3  18.0  34.3  19    24.1
4  21.2  24.5  22.1  30.4
5  17.1  30    23.0  21.7
6  17.7  26.5  19.6  24.0

暫無
暫無

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

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