将估计值和p值输入数据框

时间:2018-11-14 16:01:44

标签: r

我对R相当陌生。我的数据看起来像这样(仅包含9000列和66行)

Time <- c(0, 6.4, 8.6, 15.2, 19.4, 28.1, 42.6, 73, 73, 85, 88, 88, 88, 88, 88)
ID1 <- c(55030, 54539, 54937, 48897, 58160, 54686, 55393, 47191, 39805, 37601, 51328, 28882, 45587, 60061, 31892, 28670)
ID2 <- c(20485, 11907, 10571, 20974, 10462, 11149, 20970, NA, NA, 9295, NA, 8714, 24446, 10748, 9037, 11859)
ID3 <- c(93914, 44482, 43705, 51144, 49485, 43908, 44324, 37342, 18872, 39660,61673, 43837, 36528, 44738, 41648, 11100)
DF <- data.frame (Time, ID1, ID2, ID3)

我想要一个看起来像这样的数据框:

ID1,rho,p值

ID2,rho,p值

...

rho和p值是带有时间和每个ID的cor.test(矛兵)的结果

我尝试过的其他方法之一:

results <- data.frame(ID="", Estimate="", P.value="")
estimates = numeric(16)
pvalues = numeric(16)
for (i in 2:4){
  test <- cor.test(DF[,1], DF[,i])
  estimates[i] = test$estimate
  pvalues[i] = test$p.value
}

R给了我以下错误:

Error: object 'test' not found

我也尝试过:

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

R给了我类似的错误

Error: object 'cor.result' not found

我敢肯定这是一个简单的解决方法,但我似乎无法弄清楚。任何帮助都超过了欢迎。

这是我跑步后得到的

dput(head(SmallDataset[,1:5]))

structure(list(Species = c("Human.hsapiens", "Chimpanzee.ptroglodytes", 
"Gorilla.ggorilla", "Orangutan.pabelii", "Gibbon.nleucogenys", 
"Macaque.mmulatta"), Time = c(0, 6.4, 8.61, 15.2, 19.43, 28.1
), ID1 = c(55030, 54539, 54937, 48897, 58160, 54686), ID2 = c(20485, 
11907, 10571, 20974, 10462, 11149), ID3 = c(93914, 44482, 43705, 
51144, 49485, 43908)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

2 个答案:

答案 0 :(得分:1)

我的解决方案涉及在lapply调用中定义一个函数

##
library(dplyr)

###Create dataframe
Time <- c(0, 6.4, 8.6, 15.2, 19.4, 28.1, 42.6, 73, 73, 85, 88, 88, 88, 88, 88, 89)
ID1 <- c(55030, 54539, 54937, 48897, 58160, 54686, 55393, 47191, 39805, 37601, 51328, 28882, 45587, 60061, 31892, 28670)
ID2 <- c(20485, 11907, 10571, 20974, 10462, 11149, 20970, NA, NA, 9295, NA, 8714, 24446, 10748, 9037, 11859)
ID3 <- c(93914, 44482, 43705, 51144, 49485, 43908, 44324, 37342, 18872, 39660,61673, 43837, 36528, 44738, 41648, 11100)
DF <- data.frame (Time, ID1, ID2, ID3)

##Run the correlations
l2 <- lapply(2:4, function(i)cor.test(DF$Time, DF[,i]))

##Define function to extract p_value and coefficients
l3 <- lapply(l2, function(i){
  return(tibble(estimate = i$estimate,
         p_value = i$p.value))
})

##Create a dataframe with information
l4 <- bind_rows(l3) %>% mutate(ID = paste0("ID", 1:3)) ##Data frame with info

l4

答案 1 :(得分:0)

考虑建立一个lapply的数据帧列表(一个类似于for的迭代函数,但是建立一个长度相等的对象列表作为输入)。然后,将所有数据框元素行绑定在一起:

results <- lapply(2:4, function(i){      
  test <- cor.test(DF[,1], DF[,i])

  data.frame(ID = names(DF)[i],
             estimate =  unname(test$estimate),
             pvalues = unname(test$p.value))      
})

final_df <- do.call(rbind, results)
final_df

#    ID   estimate     pvalues
# 1 ID1 -0.6238591 0.009805341
# 2 ID2 -0.2270515 0.455676037
# 3 ID3 -0.4964092 0.050481533

注意:您发布的 Time 数据缺少观察值,因此无法立即与其他向量一起转换为data.frame()。为了解决这个问题,我在结尾处补充了第六名88:

Time <- c(0, 6.4, 8.6, 15.2, 19.4, 28.1, 42.6, 73, 73, 85, 88, 88, 88, 88, 88, 88)

使用发布的SmallDataset:

SmallDataset <- structure(...)

results <- lapply(3:5, function(i){      
  test <- cor.test(SmallDataset$Time, SmallDataset[,i])

  data.frame(ID = names(SmallDataset)[i],
             estimate =  unname(test$estimate),
             pvalues = unname(test$p.value))      
})

final_df <- do.call(rbind, results)
final_df

#    ID    estimate   pvalues
# 1 ID1  0.03251407 0.9512461
# 2 ID2 -0.41733336 0.4103428
# 3 ID3 -0.60732484 0.2010166