如何从 data.frame 中的 cor.test() 提取 p.value 和估计值?
How to extract the p.value and estimate from cor.test() in a data.frame?
在这个例子中,我有来自 50 个不同站点的温度值,我想将 Site1 与所有 50 个站点相关联。但我只想提取组件 "p.value" 和 "estimate" 用函数 cor.test() 生成的 data.frame 分为两个不同的列。
我已经尝试过了并且有效,但我不知道如何!
出于这个原因,我想知道如何简化我的代码,因为问题是我必须 运行 两次循环 "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
非常感谢你的帮助:)
首先,我猜你的代码中有一个拼写错误(如果你想要唯一值,你应该有 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
}
让它更简洁一些。
我可能还会提供以下内容(屏蔽循环):
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))
})
)
类似于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"))
在这个例子中,我有来自 50 个不同站点的温度值,我想将 Site1 与所有 50 个站点相关联。但我只想提取组件 "p.value" 和 "estimate" 用函数 cor.test() 生成的 data.frame 分为两个不同的列。
我已经尝试过了并且有效,但我不知道如何! 出于这个原因,我想知道如何简化我的代码,因为问题是我必须 运行 两次循环 "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
非常感谢你的帮助:)
首先,我猜你的代码中有一个拼写错误(如果你想要唯一值,你应该有 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
}
让它更简洁一些。
我可能还会提供以下内容(屏蔽循环):
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))
})
)
类似于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"))