Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在数据框(矩阵)中包含新行和新列,并在R中的数据集中基于这些新行和新列执行数学运算_R_Dataframe_Equation - Fatal编程技术网

如何在数据框(矩阵)中包含新行和新列,并在R中的数据集中基于这些新行和新列执行数学运算

如何在数据框(矩阵)中包含新行和新列,并在R中的数据集中基于这些新行和新列执行数学运算,r,dataframe,equation,R,Dataframe,Equation,我是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

我是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
a E 101 110 118 98
#>F 100 107 100

X_i如果使用矩阵,则更简单:

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

Xi这里是另一个解决方案,但我相信上面提出的矩阵解决方案更简单、更直接。这里我们使用
purrr
包的
pmap
函数在一个行操作中一次迭代3个参数。请注意,我们从您的
X_I
Y_j
向量,与原始数据帧的维数相同。然后我使用了
pmap
函数进行算术运算。首先,我将所有三个数据集收集在一个列表中,并在公式部分
。1
。2
。3
分别引用同一行中每个数据集的对应元素,因为我们正在执行行操作,并且所有三个数据集都具有相同的维度

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
库(purrr)

非常感谢!成功了!非常感谢您的热情帮助。:)我在我的公式中犯了一个错误。我打算使用公式:结果非常感谢!它起作用了!a在我的公式中犯了一个错误。我在我的公式中犯了一个错误。但你的解决方案是完美的。我打算使用公式:结果这是我的荣幸,如果有什么我可以帮忙的,请告诉我。显然,我会的。现在,它工作得非常好。:)