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


Вы можете использовать функцию apply() , чтобы применить функцию к каждой строке в матрице или фрейме данных в R.

Эта функция использует следующий базовый синтаксис:

применить(X, MARGIN, FUN)

куда:

  • X: Имя матрицы или фрейма данных.
  • MARGIN: Размер для выполнения операции. Используйте 1 для строки, 2 для столбца.
  • FUN: функция для применения.

В следующих примерах показано, как использовать этот синтаксис на практике.

Пример 1. Применение функции к каждой строке матрицы

Предположим, у нас есть следующая матрица в R:

#create matrix
mat <- matrix(1:15, nrow= 3 )

#view matrix
mat

 [,1] [,2] [,3] [,4] [,5]
[1,] 1 4 7 10 13
[2,] 2 5 8 11 14
[3,] 3 6 9 12 15

Мы можем использовать функцию apply() для применения различных функций к строкам матрицы:

#find mean of each row
apply(mat, 1, mean)

[1] 7 8 9

#find sum of each row
apply(mat, 1, sum)

[1] 35 40 45

#find standard deviation of each row
apply(mat, 1, sd)

[1] 4.743416 4.743416 4.743416

#multiply the value in each row by 2 (using t() to transpose the results)
t(apply(mat, 1, function (x) x \* 2))

 [,1] [,2] [,3] [,4] [,5]
[1,] 2 8 14 20 26
[2,] 4 10 16 22 28
[3,] 6 12 18 24 30

#normalize every row to 1 (using t() to transpose the results)
t(apply(mat, 1, function (x) x / sum(x) ))

 [,1] [,2] [,3] [,4] [,5]
[1,] 0.02857143 0.1142857 0.2 0.2857143 0.3714286
[2,] 0.05000000 0.1250000 0.2 0.2750000 0.3500000
[3,] 0.06666667 0.1333333 0.2 0.2666667 0.3333333

Обратите внимание, что если вы хотите найти среднее значение или сумму каждой строки, быстрее использовать встроенные функции rowMeans() или rowSums() :

#find mean of each row
rowMeans(mat)

[1] 7 8 9

#find sum of each row
rowSums(mat)

[1] 35 40 45

Пример 2. Применение функции к каждой строке во фрейме данных

Предположим, у нас есть следующая матрица в R:

#create data frame
df <- data.frame(var1=1:3,
 var2=4:6,
 var3=7:9,
 var4=10:12,
 var5=13:15)

#view data frame
df

 var1 var2 var3 var4 var5
1 1 4 7 10 13
2 2 5 8 11 14
3 3 6 9 12 15

Мы можем использовать функцию apply() для применения различных функций к строкам фрейма данных:

#find mean of each row
apply(df, 1, mean)

[1] 7 8 9

#find sum of each row
apply(df, 1, sum)

[1] 35 40 45

#find standard deviation of each row
apply(df, 1, sd)

[1] 4.743416 4.743416 4.743416

#multiply the value in each row by 2 (using t() to transpose the results)
t(apply(df, 1, function (x) x \* 2))

 var1 var2 var3 var4 var5
[1,] 2 8 14 20 26
[2,] 4 10 16 22 28
[3,] 6 12 18 24 30

#normalize every row to 1 (using t() to transpose the results)
t(apply(df, 1, function (x) x / sum(x) ))

 var1 var2 var3 var4 var5
[1,] 0.02857143 0.1142857 0.2 0.2857143 0.3714286
[2,] 0.05000000 0.1250000 0.2 0.2750000 0.3500000
[3,] 0.06666667 0.1333333 0.2 0.2666667 0.3333333

Подобно матрицам, если вы хотите найти среднее значение или сумму каждой строки, быстрее использовать встроенные функции rowMeans() или rowSums() :

#find mean of each row
rowMeans(df)

[1] 7 8 9

#find sum of each row
rowSums(df)

[1] 35 40 45

Дополнительные ресурсы

Как получить номера строк в R
Как выполнить функцию СЧЁТЕСЛИ в R
Как выполнить функцию СУММЕСЛИ в R