Как я могу применить функцию к каждой строке фрейма данных в R, когда функция требует нескольких входов? - PullRequest
1 голос
/ 21 сентября 2019

Мне нужно выполнить тест хи-квадрат для данных из каждой строки фрейма данных в R. До сих пор у меня есть функция, которая может создать матрицу и запустить тест на матрице.Это работает нормально, когда я вручную вводить данные в функцию.

chisquare.table <- function(var1, var2, var3, var4){
  t <- matrix(c(var1, var2, var3, var4), nrow = 2)
  chisq.test(t)

chisquare.table(80, 99920, 85, 99915)

Однако я хочу применить эту функцию к каждой строке фрейма данных так, чтобы var1 был строкой x столбец 1, var2 был строкой x столбец 2, var3 - строка x столбец 3, а var4 - строка x столбец 4.

Я пробовал несколько различных способов применения (), но я не могу найти тот, который позволяет мне брать данные из строки так, как я хочу.Я был бы очень признателен за любую помощь или совет по этому вопросу, так как я не нашел много онлайн об использовании apply () с несколькими входами.

1 Ответ

1 голос
/ 21 сентября 2019

Если мы применяем функцию к каждой строке, используйте apply.Кроме того, вместо указания элементов строки один за другим в качестве аргументов (поскольку они могут различаться для каждого набора данных), используйте ..., который может принимать любое количество элементов в качестве аргументов, и создайте matrix из него

chisquare.tableMod <- function(...){

     t <- matrix(c(...), nrow = 2) 
      chisq.test(t)

   }

out <- apply(df1, 1, chisquare.tableMod)

Тестирование с выходом из функции OP

chisquare.table <- function(var1, var2, var3, var4){
     t <- matrix(c(var1, var2, var3, var4), nrow = 2)


     chisq.test(t)
  }

outOld <- chisquare.table(80, 99920, 85, 99915)
identical(out[[1]], outOld)
#[1] TRUE

Как указано в комментариях @ 42-, apply возвращает matrix, а матрица может содержать только один класс.Поэтому выбирайте только те столбцы, которые numeric при работе с apply (или только с одним классом)

data

df1 <- data.frame(v1 = c(80, 79, 49), v2 = c(99920, 98230, 43240),
      v3  = c(85, 40, 35), v4 = c(99915, 43265, 43238))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...