如何在数据框(矩阵)中包含新的行和列,并在 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
由 reprex package (v2.0.0)
于 2021-04-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
包的 pmap
函数在逐行操作中一次迭代 3 个参数。请注意,我们从您的 X_i
和 Y_j
向量中创建了另外 2 个数据框,与原始数据框的维度相同。然后我使用 pmap
函数进行算术运算。首先,我将所有三个数据集收集在一个列表中,在公式部分 ..1
、..2
和 ..3
分别引用同一行中每个数据集的相应元素,因为我们是执行 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
我是 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
由 reprex package (v2.0.0)
于 2021-04-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
包的 pmap
函数在逐行操作中一次迭代 3 个参数。请注意,我们从您的 X_i
和 Y_j
向量中创建了另外 2 个数据框,与原始数据框的维度相同。然后我使用 pmap
函数进行算术运算。首先,我将所有三个数据集收集在一个列表中,在公式部分 ..1
、..2
和 ..3
分别引用同一行中每个数据集的相应元素,因为我们是执行 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