评估数据帧并存储结果

时间:2011-07-19 17:34:10

标签: r

我的数据帧(m * n)有几百列,我需要将每列与所有其他列(列联表)进行比较,然后执行chisq测试并将每列的结果保存在不同的变量中。

它一次为一列工作,

s <- function(x) {
  a <- table(x,data[,1])
  b <- chisq.test(a)
}
c1 <- apply(data,2,s)

结果存储在第1列的c1中,但是如何在所有列上循环并保存每列的结果以进行进一步分析?

2 个答案:

答案 0 :(得分:4)

从根本上说,这里有一些问题:

  1. 你在很大程度上依赖于全球争论,而不是本地争论。 这使得“数据”的双重使用令人困惑。

  2. 同样,您依赖于硬编码值(第1列)而不是 将它作为参数传递给函数。

  3. 您没有从chisq.test()中提取所需的值。 这意味着您的结果将作为列表返回。

  4. 您没有提供一些示例数据。所以这里有一些:

    m&lt; - 10 n < - 4 mytable&lt; - matrix(runif(m * n),nrow = m,ncol = n)

  5. 修复上述问题后,只需在各列上运行循环(因为您现在已经避免对列进行硬编码)并存储结果。

答案 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值,请先选择它们。