按组查找数据帧中两列的相关系数

时间:2014-04-20 23:15:00

标签: r

我有一个大型数据框" Im"看起来像这样

        V1   V7   X134    X135    X136    X137   X138
      1 m  1000 543.360 1057.770 1869.42 2664.06 3935.307
      2 m  2000 767.256 1704.430 2993.63 5248.06 6341.129
      3 m  3000 413.096  796.168 1441.13 3500.46 2962.048
      4 a  4000 257.128  559.200 1014.79 2948.64 2080.437
      5 a  5000 188.504  440.640  813.60 2538.11 1639.349
      6 a  6000 483.704  921.064 1679.98 3626.44 3426.709
      ....

我想找到列X135和所有其他编号列之间的相关系数,换句话说,我基本上需要这个

        > cor(Im$X135,Im$X136)
        > cor(Im$X135,Im$X134)
        > cor(Im$X135,Im$X137)

问题是我需要按" V1"分组的相关性。我正在寻找的输出应该是这样的(使用假设的相关系数)

        V1   cc134   cc136  cc137
      1 m    0.92    0.99   0.95
      1 a    0.99    0.93   0.89

我已经看过tapply,ddply,aggregate和我发现的所有内容都是行和函数,如sum和average,导致输出具有相同的列。我是R的新手,所以无法弄清楚如何编写一个聪明的函数来做到这一点。我考虑过重新整理数据,但也没有得到任何结果。任何和所有帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

此类问题最适合data.table包。 这是一个简单的尝试:

library(data.table)

data <- read.table(text="   V1   V7     134      135     136     137    138
      1 m  1000 543.360 1057.770 1869.42 2664.06 3935.307
      2 m  2000 767.256 1704.430 2993.63 5248.06 6341.129
      3 m  3000 413.096  796.168 1441.13 3500.46 2962.048
      4 a  4000 257.128  559.200 1014.79 2948.64 2080.437
      5 a  5000 188.504  440.640  813.60 2538.11 1639.349
      6 a  6000 483.704  921.064 1679.98 3626.44 3426.709",header=T)

data <- data.table(data)

setkey(data,V1)

data[,list(cc134=cor(X135,X134),cc136=cor(X135,X136),cc137=cor(X135,X137)),by=key(data)]

要了解有关该套餐的更多信息:

vignette("datatable-intro")
vignette("datatable-faq")
vignette("datatable-timings")

或者看到它的实际效果:

example(data.table)