【问题标题】:create a table with test results. Apply instead of loop创建一个包含测试结果的表。应用而不是循环
【发布时间】:2014-08-29 14:49:34
【问题描述】:

我想根据虚拟变量对不同的分组多次运行 wilcox.test。 我有一个数据集,其中包含收入列,然后是一系列虚拟变量。

理想情况下,我想要一张这样的表格。我希望这只是为了有一种快速的方法来查看哪些变量很重要,需要更仔细地观察。我有 100 多个虚拟变量。

Variable   p-value
dummy1     0.052
dummy2     0.143
dummy3     0.001

我知道这应该可以使用 apply 或 sapply。但我不知道该怎么做。

目前我正在使用循环运行它,但这不是很实用,因为结果没有用虚拟变量名称或数字标记。

list <- list(data$dummy1, data$dummy2, data$dummy3, .....)
for (i in 1:100){
  print(wilcox.test(data$Revenue ~ list[[i]]) )
  }

【问题讨论】:

    标签: r apply sapply


    【解决方案1】:

    首先,不要设置对象名称“列表”。这可能会导致与list 发生冲突。

    试试这个:

    set.seed(123)
    data <- data.frame(Revenue = rnorm(100, mean=1000, sd=100), dummy1 = sample(c(0,1), 100, replace = TRUE), dummy2 = sample(c(0,1), 100, replace = TRUE), dummy3 = sample(c(0,1), 100, replace = TRUE))
    
    l <- list(data$dummy1, data$dummy2, data$dummy3)
    names(l) <- names(data[,2:ncol(data)])
    
    out <- as.data.frame(t(sapply(l, FUN = function(x) wilcox.test(data$Revenue ~ x)$p.value, USE.NAMES = TRUE)))
    rownames(out) <- "Revenue"
    
    
    # The output
              dummy1   dummy2    dummy3
    Revenue 0.975232 0.689687 0.1830813
    

    如果你想要多个变量:

    set.seed(123)
    data <- data.frame(Profits = rnorm(100, mean=1000, sd=100), Revenue = rnorm(100, mean=1000, sd=100), dummy1 = sample(c(0,1), 100, replace = TRUE),
                       dummy2 = sample(c(0,1), 100, replace = TRUE), dummy3 = sample(c(0,1), 100, replace = TRUE))
    l <- list(data$dummy1, data$dummy2, data$dummy3)
    
    #Vector of variables of interest
    vec <- c("Revenue", "Profits")
    names(l) <- names(data)[!names(data) %in% vec]
    
    out <- t(sapply(vec, FUN = function(y) sapply(l, FUN = function(x) wilcox.test(data[,c(y)] ~ x)$p.value, simplify=F)))
    out
    
            dummy1    dummy2    dummy3   
    Revenue 0.8491605 0.3425132 0.1765484
    Profits 0.1830813 0.1951    0.5036012 
    

    【讨论】:

    • 感谢您的帮助。我仍然掌握 R 的窍门。如果我想添加像 Profits 这样的另一行,是否必须使用不同的应用函数?
    • @Constantin,如果你想要多个变量,你需要第二个 sapply 语句和一个你想要测试的变量的向量。 vec &lt;- c("Revenue", "Profits") 然后你也可以循环这些。 out &lt;- t(sapply(vec, FUN = function(y) sapply(l, FUN = function(x) wilcox.test(data[,c(y)] ~ x)$p.value, simplify=F)))
    • @charles 命名对象list 永远不会与list(...) 冲突
    • @SeñorO 我的错误,但感谢您的澄清。通常最好不要将对象命名为与函数相同的名称。
    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 2022-10-17
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2011-09-08
    相关资源
    最近更新 更多