Как включить новые строки и столбцы во фрейм данных (матрицу) и выполнить математическую операцию на их основе в наборе данных в R

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

Создано 2021-04-27 пакетом reprex (v2.0.0)

Ответ №1:

Вот еще одно решение, но я считаю, что предложенное выше матричное решение намного проще и проще. Здесь мы используем pmap функцию purrr пакета для перебора сразу 3 аргументов в последовательной операции. Пожалуйста, обратите внимание, что мы создали 2 других фрейма данных из ваших 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
 

Комментарии:

1. Большое спасибо! Это сработало! Однако А допустил ошибку в моей формуле. Я допустил ошибку в своей формуле. Но ваше решение идеально. Я намеревался использовать формулу: результат

2. Мне очень приятно, дайте мне знать, если я могу чем — нибудь помочь.

3. Очевидно, я так и сделаю. На данный момент это сработало фантастически. 🙂

Ответ №2:

Это проще, если вы используете матрицы:

 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
 

Комментарии:

1. Большое спасибо! Это сработало! Я ценю всю вашу сердечную помощь. 🙂 Я допустил ошибку в своей формуле. Я намеревался использовать формулу: результат Кстати, решение идеальное. Еще раз спасибо. 🙂