【问题标题】:Apply a function to pairs of columns in a loop将函数应用于循环中的列对
【发布时间】:2018-11-07 15:52:26
【问题描述】:

我的数据如下所示:

a1 <- runif(30, 1, 100)
b1 <- runif(30, 1, 100)
c1 <- runif(30, 1, 100)
a2 <- runif(30, 1, 100)
b2 <- runif(30, 1, 100)
c2 <- runif(30, 1, 100)
dframe <- data.frame(a1=a1, b1=b1, c1=c1, a2=a2, b2=b2, c2=c2)

我想计算 a1 和 a2、b1 和 b2、c1 和 c2 之间的相关性,但我想以一种有效的方式来计算,避免为每个相关性编写一行代码。我试图编写一个 for 循环,但没有成功。

【问题讨论】:

  • 在使用runif等功能时请使用set.seed,以保证重现性

标签: r for-loop iteration correlation


【解决方案1】:

这是一个选项

lapply(split.default(dframe, sub("\\d+$", "", names(dframe))), cor)
#$a
#          a1        a2
#a1 1.0000000 0.1132033
#a2 0.1132033 1.0000000

#$b
#           b1         b2
#b1 1.00000000 0.09113974
#b2 0.09113974 1.00000000

#$c
#           c1         c2
#c1  1.0000000 -0.2066311
#c2 -0.2066311  1.0000000

我们按列拆分您的数据框,然后使用lapply 遍历结果列表。

【讨论】:

  • 这行得通。但是如果名称不匹配怎么办?例如,如果我想要 a1 和 b2 以及 b1 和 c2 之间的相关性怎么办?
【解决方案2】:

一个基本的 R 想法,

sapply(unique(gsub('\\d+', '', names(dframe))), function(i) 
                                                cor(dframe[grepl(i, names(dframe))]))

给出,

              a          b           c
[1,] 1.00000000  1.0000000  1.00000000
[2,] 0.01987806 -0.2247265 -0.08667891
[3,] 0.01987806 -0.2247265 -0.08667891
[4,] 1.00000000  1.0000000  1.00000000

【讨论】:

    【解决方案3】:

    以整洁的风格,

    set.seed(123)
    # for a reproducible way, set seeds.
    a1 <- runif(30, 1, 100)
    b1 <- runif(30, 1, 100)
    c1 <- runif(30, 1, 100)
    a2 <- runif(30, 1, 100)
    b2 <- runif(30, 1, 100)
    c2 <- runif(30, 1, 100)
    dframe <- data.frame(a1=a1, b1=b1, c1=c1, a2=a2, b2=b2, c2=c2)
    library(psych)
    library(tidyverse)
    dframe %>% 
        corr.test(use = "pairwise.complete.obs") %>% 
        .$ci %>% 
        rownames_to_column('pairs') %>% 
        filter(pairs %in% c('a1-a2','b1-b2','c1-c2'))
    #>   pairs      lower            r     upper         p
    #> 1 a1-a2 -0.2365720  0.135222126 0.4724741 0.4761839
    #> 2 b1-b2 -0.5137963 -0.188401038 0.1843832 0.3187486
    #> 3 c1-c2 -0.3523592  0.009060141 0.3681278 0.9621014
    

    reprex package (v0.2.1) 于 2018 年 11 月 8 日创建

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多