如何从data.frame中的cor.test()中提取p.value和估计?

时间:2015-02-18 06:11:36

标签: r for-loop

在这个例子中,我有来自50个不同站点的温度值,我想将Site1与所有50个站点相关联。但我想只提取 " p.value" "估计" 使用data.frame中的函数 cor.test()生成两个不同的列。

我已经完成了我的尝试,但它确实有效,但我不知道怎么做! 出于这个原因,我想知道如何简化我的代码,因为问题是我必须运行两次Loop" for"得到我的结果。

以下是我的例子:

# Temperature data
 data <- matrix(rnorm(500, 10:30, sd=5), nrow = 100, ncol = 50, byrow = TRUE,
               dimnames = list(c(paste("Year", 1:100)),
                               c(paste("Site", 1:50))) )
# Empty data.frame
 df <- data.frame(label=paste("Site", 1:50), Estimate="", P.value="")

# Extraction
for (i in 1:50) {
 df1 <- cor.test(data[,1], data[,i] )
 df[,2:3] <- df1[c("estimate", "p.value")]
   }

for (i in 1:50) {
  df1 <- cor.test(data[,1], data[,i] )
 df[i,2:3] <- df1[c("estimate", "p.value")]
   }

 df

我非常感谢你的帮助:)。

3 个答案:

答案 0 :(得分:5)

我也可以提供以下内容(屏蔽循环):

result <- do.call(rbind,lapply(2:50, function(x) {
  cor.result<-cor.test(data[,1],data[,x])
  pvalue <- cor.result$p.value
  estimate <- cor.result$estimate
  return(data.frame(pvalue = pvalue, estimate = estimate))
})
)

答案 1 :(得分:1)

首先,我猜你的代码中有一个拼写错误(如果你想要唯一的值,你应该有rnorm(5000。否则你将循环使用这500个数字10次。

无论如何,这样做的一个简单方法是:

data <- matrix(rnorm(5000, 10:30, sd=5), nrow = 100, ncol = 50, byrow = TRUE,
               dimnames = list(c(paste("Year", 1:100)),
                               c(paste("Site", 1:50))) )
# Empty data.frame
df <- data.frame(label=paste("Site", 1:50), Estimate="", P.value="")
estimates = numeric(50)
pvalues = numeric(50)
for (i in 1:50){
  test <- cor.test(data[,1], data[,i])
  estimates[i] = test$estimate
  pvalues[i] = test$p.value
}
df$Estimate <- estimates
df$P.value <- pvalues
df

编辑:我相信您的问题是在行df <- data.frame(label=paste("Site", 1:50), Estimate="", P.value="")中如果您执行typeof(df$Estimate),您会看到它正在预期一个整数,并且typeof(test$estimate)显示它会吐出一个双倍,所以R不知道你要用这​​两个值做什么。您可以像这样重做代码:

df <- data.frame(label=paste("Site", 1:50), Estimate=numeric(50), P.value=numeric(50))
for (i in 1:50){
  test <- cor.test(data[,1], data[,i])
  df$Estimate[i] = test$estimate
  df$P.value[i] = test$p.value
}

使它更简洁。

答案 2 :(得分:1)

类似于colemand77的答案:

创建一个cor函数:

cor_fun <- function(x, y, method){
  tmp <- cor.test(x, y, method= method)
  cbind(r=tmp$estimate, p=tmp$p.value) }

通过data.frame申请。您可以将结果转置为按行获取p和r:

t(apply(data, 2, cor_fun, data[, 1], "spearman"))