将函数应用于循环中的成对列

时间:2018-11-07 15:52:26

标签: r for-loop iteration correlation

我的数据如下:

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循环,但没有成功。

3 个答案:

答案 0 :(得分:2)

这是一个选择

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遍历结果列表。

答案 1 :(得分: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

答案 2 :(得分:1)

以整洁的风格

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-08创建