[英]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.