在R中排序数据以及如何提取值?

时间:2012-07-16 09:22:17

标签: r

这是我的数据集,我是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 

我想将TrSw与其余的colmn变量进行比较,即

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

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

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

我也想提取Age和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))

1 个答案:

答案 0 :(得分:3)

虽然我不相信为50个相关产生p值的统计优点,但对于lapply()和朋友来说这很容易。

为此,我选择迭代names KenTau "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时,这实际上是指{的副本{1}}:

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]]转弯时通过我们,因此我们只需要应用[[函数(是的,它可能看起来不像一个,但它实际上是一个函数; { {1}})。该函数只接受一个参数(在本例中我们可以使用我们想要提取的组件的名称),我将其作为"[["()传递:

"p.value"

因为我向res <- sapply(cors, `[[`, "p.value") 添加了namescors将返回一个命名向量,其中包含 p - 命名变量an {{ 1}}:

sapply()

如果您想要结果的其他组件,请说出测试统计信息本身,然后将TrSw替换为您想要的组件名称,例如: R> res Age CapReg FeelChk CanSw 1.157889e-01 3.920115e-01 2.189736e-04 1.578040e-06 获得肯德尔的Tau。

如果你要为很多变量做这个,那就去看看多个测试并调整 p - 值,因为我不相信你的结果会像50那样有用的相关性。