2012-07-16 106 views
0

这是我的数据集,我是R和iam的新手,试图为此数据集编写脚本。在R中排序数据以及如何提取值?

R> head(KenTau) 
    Age CapReg TrSw FeelChk CanSw 
1 20  1 0  0  0 
2 36  1 0  0  0 
3 35  1 3  2  2 
4 21  0 0  2  2 
5 43  0 0  2  2 
6 34  1 0  0  0 

我想用colmn变量的其余部分比较TRSW即

TrSw Vs Age 
TrSw Vs CapReg 
TrSw Vs FeelChk 
TrSw Vs CanSw 

我用这一个R上运行它,我用这个命令

cor.test(KenTau$Age, KenTau$TrSw, alternative="two.sided", method="kendall") 

我也想提取年龄和pvalue,所以我可以有一个列表,因为我有近50个变量。

dput()数据

KenTau <- structure(list(Age = c(20L, 36L, 35L, 21L, 43L, 34L, 37L, 62L, 
54L, 47L, 48L, 45L, 2L, 2L, 2L, 54L, 52L, 40L, 58L, 29L, 27L, 
28L, 46L, 35L, 50L, 31L, 48L, 2L, 29L, 54L, 52L, 28L, 28L, 26L, 
38L, 59L, 51L, 58L, 39L, 44L, 53L, 2L, 39L, 55L, 48L, 2L, 23L, 
51L, 50L, 26L, 28L, 40L, 38L, 61L, 52L, 33L, 2L, 59L, 27L, 45L, 
45L, 57L, 66L, 52L, 58L, 34L, 28L, 39L, 48L, 53L, 39L, 46L, 57L, 
36L, 25L, 22L, 29L, 46L, 25L, 25L, 35L, 44L, 24L, 26L, 33L, 27L, 
41L, 28L, 26L, 32L, 36L, 35L, 32L, 33L, 29L, 29L, 52L, 55L, 23L, 
29L, 45L, 26L, 48L, 54L, 50L, 35L, 27L, 39L, 41L, 30L, 30L, 31L, 
27L, 28L, 27L, 25L, 34L, 23L, 30L, 34L, 52L, 20L, 31L, 2L, 45L, 
34L, 21L, 60L, 34L, 40L, 47L, 30L, 54L, 36L, 32L, 31L, 55L, 57L, 
23L, 31L, 26L, 26L, 27L, 19L, 26L, 25L, 37L, 47L, 38L, 38L, 26L, 
25L, 41L), CapReg = c(1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 
1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 
0L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 
1L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 
0L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 
1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 
1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 
1L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 
1L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
    TrSw = c(0L, 0L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 
    1L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 
    0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 
    1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 
    1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 
    1L, 1L, 0L, 3L, 0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 
    1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 1L, 
    1L, 1L, 0L, 1L, 1L, 1L), FeelChk = c(0L, 0L, 2L, 2L, 2L, 
    0L, 2L, 2L, 2L, 3L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 2L, 0L, 1L, 
    0L, 1L, 2L, 2L, 1L, 1L, 0L, 2L, 2L, 1L, 2L, 2L, 0L, 1L, 2L, 
    0L, 1L, 2L, 2L, 3L, 0L, 2L, 1L, 0L, 0L, 2L, 1L, 2L, 2L, 1L, 
    1L, 0L, 1L, 2L, 0L, 1L, 0L, 0L, 1L, 1L, 0L, 3L, 1L, 2L, 1L, 
    1L, 0L, 0L, 1L, 1L, 1L, 0L, 2L, 3L, 1L, 2L, 2L, 1L, 1L, 0L, 
    2L, 1L, 0L, 1L, 1L, 0L, 2L, 1L, 1L, 0L, 0L, 0L, 2L, 1L, 2L, 
    1L, 0L, 0L, 0L, 0L, 2L, 0L, 1L, 0L, 2L, 2L, 2L, 0L, 0L, 2L, 
    3L, 2L, 0L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 1L, 2L, 2L, 
    1L, 1L, 2L, 0L, 3L, 1L, 0L, 1L, 1L, 2L, 2L, 3L, 3L, 1L, 0L, 
    0L, 2L, 0L, 2L, 2L, 3L, 0L, 1L, 1L, 2L, 0L, 0L, 0L), CanSw = c(0L, 
    0L, 2L, 2L, 2L, 0L, 2L, 2L, 2L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 
    0L, 2L, 2L, 0L, 0L, 0L, 2L, 2L, 0L, 0L, 2L, 2L, 2L, 3L, 2L, 
    2L, 0L, 0L, 2L, 0L, 0L, 2L, 2L, 1L, 1L, 2L, 0L, 0L, 2L, 2L, 
    3L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 0L, 1L, 0L, 2L, 1L, 3L, 1L, 
    0L, 0L, 2L, 0L, 0L, 0L, 2L, 0L, 1L, 1L, 1L, 2L, 0L, 1L, 2L, 
    2L, 1L, 1L, 0L, 2L, 0L, 0L, 1L, 0L, 0L, 2L, 1L, 0L, 0L, 0L, 
    0L, 2L, 1L, 2L, 0L, 2L, 2L, 0L, 1L, 2L, 0L, 1L, 0L, 2L, 2L, 
    2L, 0L, 0L, 2L, 3L, 2L, 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 
    0L, 0L, 2L, 2L, 1L, 1L, 2L, 1L, 0L, 0L, 2L, 0L, 1L, 2L, 2L, 
    1L, 1L, 0L, 0L, 2L, 2L, 0L, 2L, 2L, 3L, 1L, 1L, 0L, 2L, 0L, 
    2L, 0L)), .Names = c("Age", "CapReg", "TrSw", "FeelChk", 
"CanSw"), class = "data.frame", row.names = c(NA, -153L)) 

回答

3

虽然我不相信50间的相关性生成的p值的统计优劣,这是很容易lapply()和朋友做。

为此,我选择遍历names的这些不是"TrSw"的索引,因为这是您希望与所有其他索引进行比较的变量。我第一次抢使用which()这些索引:

R> inds <- which(names(KenTau) != "TrSw") 
R> inds 
[1] 1 2 4 5 

接下来我建立了一个呼叫lapply(),在那里我会遍历inds。我现在需要一个匿名函数,其索引ind作为第一个参数(这是什么lapply()将在每次迭代中传递我的函数),并且我需要传入数据,我这样做的参数为x。我的匿名函数调用cor.test(),如您在示例中所示,但请注意x[, ind]如何用于指示与TrSw相关的当前索引或列。在lapply()通话的最后一部分说,通过为x,数据KenTau这样,每当你在匿名函数看到x这真的是指KenTau副本:

cors <- lapply(inds, 
       function(ind, x) { 
        cor.test(x[, ind], x[, "TrSw"], alternative="two.sided", 
          method="kendall") 
       }, x = KenTau) 

添加一些名字是列表cors后来将有助于这样做,现在:

names(cors) <- names(KenTau)[inds] 

如果我们看一下cors我们看到它是一个列表:

R> str(cors, max = 1) 
List of 4 
$ Age :List of 8 
    ..- attr(*, "class")= chr "htest" 
$ CapReg :List of 8 
    ..- attr(*, "class")= chr "htest" 
$ FeelChk:List of 8 
    ..- attr(*, "class")= chr "htest" 
$ CanSw :List of 8 
    ..- attr(*, "class")= chr "htest" 

该列表中的每个元素都是"htest"类的对象,这是cor.test()返回的对象。有四个这样的对象,因为有四个变量要与TrSw比较。

要提取的p - 值,所以我们需要看到这被存储在"htest"对象:

R> str(cors[[1]]) 
List of 8 
$ statistic : Named num 1.57 
    ..- attr(*, "names")= chr "z" 
$ parameter : NULL 
$ p.value : num 0.116 
$ estimate : Named num 0.105 
    ..- attr(*, "names")= chr "tau" 
$ null.value : Named num 0 
    ..- attr(*, "names")= chr "tau" 
$ alternative: chr "two.sided" 
$ method  : chr "Kendall's rank correlation tau" 
$ data.name : chr "x[, ind] and x[, \"TrSw\"]" 
- attr(*, "class")= chr "htest" 

以上显示的p - 值被存储在部件p.value。提取所有4 p - 值,我们想,实际上,这样做:

res[[i]][["p.value"]] 

其中i反过来的cors每个元素。为此,我们可以再次使用lapply(),但是sapply()会将结果简化为我们的矢量,在这种情况下更简洁。 sapply()电话会通过我们每个res[[i]]转,所以我们只需要应用[[函数(是的,它可能看起来不像一个,但它非常是一个函数; "[["())。该函数只有一个参数(在这种情况下,我们可以使用我们要提取该组件的名称),我传递的"p.value":因为我加入namescors

res <- sapply(cors, `[[`, "p.value") 

sapply()将返回一个名为包含命名变量之间的相关性的p - 值向量的TrSw

R> res 
     Age  CapReg  FeelChk  CanSw 
1.157889e-01 3.920115e-01 2.189736e-04 1.578040e-06 

如果你想要的结果的另一组件,说检验统计量本身,则更换"p.value"与您想要的组件的名称"statistic"得到肯德尔的头。

如果您打算为很多变量做这个工作,那么请阅读多个测试并调整p -values,因为我不相信您的结果只会作为50个相关性有用。