简体   繁体   English

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

[英]Apply a function to pairs of columns in a loop

My data look like this: 我的数据如下所示:

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)

I want to calculate the correlation between a1 and a2, b1 and b2, c1 and c2, but I'd like to do it in an efficient way, avoiding writing one line of code for each correlation. 我想计算a1和a2,b1和b2,c1和c2之间的相关性,但是我想以一种有效的方式来做到这一点,避免为每个相关性编写一行代码。 I tried to write a for loop but I did not succeed. 我试图编写一个for循环,但没有成功。

Here is an option 这是一个选择

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

We split your data frame column-wise and then iterate over the resulting list with lapply . 我们按列划分数据帧,然后使用lapply遍历结果列表。

A base R idea, 基本的R思想,

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

which gives, 这使,

  abc [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 

In a tidyverse style, 以整洁的风格

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

Created on 2018-11-08 by the reprex package (v0.2.1) reprex软件包 (v0.2.1)创建于2018-11-08

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM