Если вы уверены, что хотите это сделать (я бы не стал думать о проблеме мультитестинга), поработайте со списками:
Data <- data.frame(
x=sample(letters[1:3],20,TRUE),
y=sample(letters[1:3],20,TRUE),
z=sample(letters[1:3],20,TRUE)
)
# Make a nice list of indices
ids <- combn(names(Data),2,simplify=FALSE)
# use the appropriate apply
my.results <- lapply(ids,
function(z) chisq.test(table(Data[,z]))
)
# use some paste voodoo to give the results the names of the column indices
names(my.results) <- sapply(ids,paste,collapse="-")
# select all values for y :
my.results[grep("y",names(my.results))]
Не сложнее, чем это.Как я покажу вам в последней строке, вы можете легко получить все тесты для определенного столбца, поэтому нет необходимости составлять список для каждого столбца.Это просто занимает больше времени и занимает больше места, но дает ту же информацию.Вы можете написать небольшую вспомогательную функцию для извлечения нужных вам данных:
extract <- function(col,l){
l[grep(col,names(l))]
}
extract("^y$",my.results)
, которая позволяет вам даже циклически перебирать различные имена столбцов вашего информационного кадра и получать список возвращаемых списков:
lapply(names(Data),extract,my.results)
Я настоятельно рекомендую вам ознакомиться с работой со списками, это один из самых мощных и чистых способов работы в R.
PS: имейте в виду, что вы сохраняете весь chisq.testобъект в вашем списке.Если вам нужно только значение для квадрата Хи или значение p, сначала выберите их.