В коде ОП нам нужно unlist
, чтобы удалить data.frame
структуру в vector
перед созданием matrix
, так как каждая строка извлекается как data.frame
str(d2[1, 2:5])
#'data.frame': 1 obs. of 4 variables:
# $ X2: int 22
# $ X3: int 12
# $ X4: int 19
# $ X5: int 12
, и это создает list
, когда мы вызываем matrix
str(matrix(d2[1, 2:5], 2, 2))
#List of 4
# $ : int 22
# $ : int 12
# $ : int 19
# $ : int 12
# - attr(*, "dim")= int [1:2] 2 2
Если мы unlist
, структура становится
str(matrix(unlist(d2[1, 2:5]), 2, 2))
#int [1:2, 1:2] 22 12 19 12
Внесение изменений в код ОП
pvals <- rep(0, nrow(d2))
for (n in 1:nrow(d2)) {
pvals[n] <- fisher.test(
matrix(unlist(d2[n, 2:5]), nrow = 2, ncol = 2, byrow = TRUE)
)$p.value
}
pvals
#[1] 0.80226381499 0.09361771430 0.23302332741 0.00001155306 0.76106849673 0.81049227216 0.14211831663 0.28974696874 0.00140855512
#[10] 0.04810238920
Другой вариант - apply
, где мы указываем MARGIN = 1
для циклического перемещения по строке
apply(d2[-1], 1, FUN = function(x) fisher.test(matrix(x, 2, 2, byrow = TRUE))$p.value)
#[1] 0.80226381499 0.09361771430 0.23302332741 0.00001155306 0.76106849673 0.81049227216 0.14211831663 0.28974696874 0.00140855512
#[10] 0.04810238920