2012-07-16 23 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個相關性有用。

相關問題