【问题标题】:Keeping the variable's original name in a for loop将变量的原始名称保留在 for 循环中
【发布时间】:2022-09-27 20:39:12
【问题描述】:

我已将此作为附加问题发布给this post 但我认为也许它应该单独发布。我有一个 for 循环,我在其中进行了 10 种不同的相关性。

  • 我正在使用未上市变量,以便 cor.test 不会返回任何错误,有没有办法保留变量 originals\' 名称? (又名 VarA、VarB 等)?我尝试过使用 myVarn ,但 cor.test() 不会运行...

  • 我用两个测试做了一个可重复的例子:

### empty list:

test_list <- list()

### make two tests to provide an example:

for (a in 1:2) {
  
  myVar <- data[a]    
  myVarn <- names(myVar)    ### doesn\'t work with this
  data$myVarUnlist <- unlist(myVar)
    
test_list[[a]] <- cor.test(data$myVar, data$VarC, data = data)
  
}

### my list: 

test_list[[1]]:

Pearson\'s product-moment correlation

data:  data$myVar and data$VarC   ########## I WANTED TO KEEP the original names here
t = 244.21, df = 53, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.9992354 0.9997421
sample estimates:
     cor 
0.999556 
  • 数据:
structure(list(VarA = c(263L, 223L, NA, 257L, 285L, 211L, 210L, 
NA, 147L, 311L, 342L, 97L, 216L, 241L, 296L, 296L, 211L, 60L, 
339L, 318L, 358L, 167L, NA, 183L, 92L, 283L, 169L, NA, 298L, 
NA, 162L, NA, 211L, 308L, 92L, 269L, NA, 197L, 280L, 259L, 313L, 
252L, 98L, 258L, 201L, 341L, 456L, 308L, 252L, 64L, 259L, 158L, 
161L, NA, NA, 129L, 264L, NA, 216L, 109L, 91L, 236L, 275L, 254L, 
221L, NA, NA, NA, NA, NA, NA), VarB = c(145L, 120L, NA, 119L, 
142L, 132L, 100L, NA, 64L, 144L, 164L, 56L, 102L, 136L, 139L, 
135L, 91L, 32L, 123L, 164L, 145L, 93L, NA, 99L, 51L, 143L, 98L, 
NA, 158L, NA, 79L, NA, 96L, 149L, 55L, 114L, NA, 94L, 137L, 130L, 
135L, 113L, 61L, 113L, 117L, 154L, 199L, 152L, 142L, 42L, 111L, 
74L, 92L, NA, NA, 85L, 116L, NA, 99L, 64L, 60L, 114L, 151L, 136L, 
116L, NA, NA, NA, NA, NA, NA), VarC = c(145L, 121L, NA, 120L, 
145L, 133L, 101L, NA, 64L, 146L, 166L, 58L, 103L, 136L, 142L, 
135L, 91L, 34L, 123L, 167L, 148L, 93L, NA, 99L, 51L, 145L, 98L, 
NA, 159L, NA, 81L, NA, 97L, 149L, 56L, 115L, NA, 96L, 137L, 132L, 
135L, 113L, 62L, 113L, 118L, 154L, 199L, 154L, 145L, 43L, 112L, 
74L, 92L, NA, NA, 86L, 116L, NA, 100L, 66L, 60L, 114L, 153L, 
136L, 120L, NA, NA, NA, NA, NA, NA), myVarUnlist = c(145L, 120L, 
NA, 119L, 142L, 132L, 100L, NA, 64L, 144L, 164L, 56L, 102L, 136L, 
139L, 135L, 91L, 32L, 123L, 164L, 145L, 93L, NA, 99L, 51L, 143L, 
98L, NA, 158L, NA, 79L, NA, 96L, 149L, 55L, 114L, NA, 94L, 137L, 
130L, 135L, 113L, 61L, 113L, 117L, 154L, 199L, 152L, 142L, 42L, 
111L, 74L, 92L, NA, NA, 85L, 116L, NA, 99L, 64L, 60L, 114L, 151L, 
136L, 116L, NA, NA, NA, NA, NA, NA)), row.names = c(NA, -71L), class = \"data.frame\")
  • 提前致谢! :)

    标签: r for-loop correlation


    【解决方案1】:

    您可以使用cor.testdo.call 的公式版本。

    test_list <- list()
    
    for (a in 1:2) {
      myVarn <- names(data)[a]
      fo <- as.formula(paste('~', myVarn, '+ VarC'))  ## gives e.g. ~VarA + VarC
      test_list[[a]] <- do.call('cor.test', list(fo, data=quote(data)))
    }
    
    test_list
    # [[1]]
    # 
    # Pearson's product-moment correlation
    # 
    # data:  VarA and VarC
    # t = 20.464, df = 53, p-value < 2.2e-16
    # alternative hypothesis: true correlation is not equal to 0
    # 95 percent confidence interval:
    #  0.9024170 0.9659991
    # sample estimates:
    #       cor 
    # 0.9421543 
    # 
    # 
    # [[2]]
    # 
    #   Pearson's product-moment correlation
    # 
    # data:  VarB and VarC
    # t = 244.21, df = 53, p-value < 2.2e-16
    # alternative hypothesis: true correlation is not equal to 0
    # 95 percent confidence interval:
    #   0.9992354 0.9997421
    # sample estimates:
    #   cor 
    # 0.999556 
    

    实际上使用lapply 更容易,给出相同的结果:

    lapply(names(data)[1:2], \(x) do.call('cor.test', list(as.formula(paste('~', x, '+ VarC')), data=quote(data))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 2016-04-14
      • 2021-11-18
      • 1970-01-01
      相关资源
      最近更新 更多