我的数据帧(m * n)有几百列,我需要将每列与所有其他列(列联表)进行比较,然后执行chisq测试并将每列的结果保存在不同的变量中。
它一次为一列工作,
s <- function(x) {
a <- table(x,data[,1])
b <- chisq.test(a)
}
c1 <- apply(data,2,s)
结果存储在第1列的c1中,但是如何在所有列上循环并保存每列的结果以进行进一步分析?
答案 0 :(得分:4)
从根本上说,这里有一些问题:
你在很大程度上依赖于全球争论,而不是本地争论。 这使得“数据”的双重使用令人困惑。
同样,您依赖于硬编码值(第1列)而不是 将它作为参数传递给函数。
您没有从chisq.test()中提取所需的值。 这意味着您的结果将作为列表返回。
您没有提供一些示例数据。所以这里有一些:
m&lt; - 10 n < - 4 mytable&lt; - matrix(runif(m * n),nrow = m,ncol = n)
修复上述问题后,只需在各列上运行循环(因为您现在已经避免对列进行硬编码)并存储结果。
答案 1 :(得分:4)
如果您确定要这样做(我不会,考虑到多重问题),请使用列表:
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值,请先选择它们。