2014-08-29 46 views
0

我想根據虛擬變量在不同的分組上多次運行wilcox.test。 我有一個數據集,其中包含Revenue列,然後是一系列虛擬變量。創建一個包含測試結果的表格。應用而不是循環

理想情況下,我想要一個這樣的表作爲結果。我想這只是爲了快速查看哪些變量對於更仔細地查看是重要的。我有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]])) 
    } 

回答

2

首先,不要設置對象名稱'list'。這可能會導致與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 
+0

完美!有效。 – Constantin 2014-08-29 16:14:24

+0

感謝您的幫助。我仍然得到了R. 如果我想添加另一行像利潤一樣,我需要使用不同的應用函數嗎? – Constantin 2014-08-29 16:15:57

+0

@Constantin,如果你想要多個變量,你需要第二個sapply語句和你想測試的變量的向量。 'vec < - c(「Revenue」,「Profits」)'那麼你也可以循環這些。 (y)sapply(l,FUN = function(x)wilcox.test(data [,c(y)]〜x)$ p.value,simplify = F) ))' – cdeterman 2014-08-29 16:31:54

相關問題