【问题标题】:How to extract the p.value and estimate from cor.test() in a data.frame?如何从 data.frame 中的 cor.test() 中提取 p.value 和估计值?
【发布时间】:2015-02-18 06:11:35
【问题描述】:

在此示例中,我有来自 50 个不同站点的温度值,我想将 Site1 与所有 50 个站点相关联。但我只想提取函数 "p.value""estimate" 生成的组件 "estimate"将 data.frame 中的 strong>cor.test() 分成两个不同的列。

我已经尝试过了,它有效,但我不知道如何! 出于这个原因,我想知道如何简化我的代码,因为问题是我必须运行两次循环“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

非常感谢您的帮助:)

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

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

    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))
    })
    )
    

    【讨论】:

      【解决方案2】:

      首先,我猜你的代码中有错字(如果你想要唯一的值,你应该有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 &lt;- 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
      }
      

      让它更简洁一点。

      【讨论】:

      • 你是对的!它是 5000 而不是 500,但这只是随机值的一个示例。非常感谢您的帮助和建议!
      【解决方案3】:

      类似于colmand77的回答:

      创建一个相关函数:

      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"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-26
        • 2011-10-02
        • 2012-01-18
        • 1970-01-01
        相关资源
        最近更新 更多