我的数据如下:
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循环,但没有成功。
答案 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创建