2017-04-20 56 views
0

我有一個數據幀「DF」,其中,第一四列是用於在列S1中的四個獨特的字符串的計數數據到S10如何通過不同的組的發生比較在r中

 DF = read.table(text="AA BB AB NC S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 
    R1 0 5 5 0 BB AB AB BB AB AB BB BB BB AB 
    R2 5 0 4 1 AB AA AB AB AA AA AB NC AA AA 
    R3 1 7 2 0 AA AB BB BB BB BB BB BB AB BB 
    R4 4 0 1 5 AA AA AB NC NC AA NC AA NC NC 
    R5 0 5 3 2 AB BB AB AB BB BB NC BB NC BB 
    R6 4 4 1 1 AB BB AA AA BB AA AA BB BB NC", header=T, stringsAsFactors=F) 
替換數據

首先,我會測試列「AA」和列「BB」的數量的比率,以找出哪些行的數據需要被替換。

  pvalue <- apply(DF[,c("AA","BB")], 1, function(x) { 
      chisq.test(as.vector(x), p = c(0.5,0.5))$p.value 
    }) 
    pvalue 

所以需要在R1至R5的一些數據,如果p值< = 0.05更換。 列「AB」和「NC」之間數字最大的字符串將更改爲「AA」和「BB」之間數字最小的字符串 例如,在R1行中,最大的數字是列「 AB「和」NC「列之間,最低的數字是列」AA「和」BB「之間的列」AA「,因此列S1到S10中的字符」AB「將被更改爲 」AA「 對於R2,改變 「AB」 到 「BB」, 爲R3,改變 「AB」 到 「AA」 爲R4,改變 「NC」 到 「BB」 ....

所以預期的結果是:

  S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 
    R1 BB AA AA BB AA AA BB BB BB AA 
    R2 BB AA BB BB AA AA BB NC AA AA 
    R3 AA AA BB BB BB BB BB BB AA BB 
    R4 AA AA AB BB BB AA BB AA BB BB 
    R5 AA BB AA AA BB BB NC BB NC BB 
    R6 AB BB AA AA BB AA AA BB BB NC 

這有點複雜。感謝您的幫助。

回答

1

apply功能找到新的和舊的價值提取應該符合的condicion最大值和最小值

DF2 <- t(apply(DF[pvalue <= 0.05, ], 1, function(x){ 
    x <- gsub(names(x[which.max(as.integer(x[3:4]))+2]), 
      names(x[which.min(as.integer(x[1:2]))]), x) 
})) 


DF2 

    AA BB AB NC S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 
R1 "0" "5" "5" "0" "BB" "AA" "AA" "BB" "AA" "AA" "BB" "BB" "BB" "AA" 
R2 "5" "0" "4" "1" "BB" "AA" "BB" "BB" "AA" "AA" "BB" "NC" "AA" "AA" 
R3 "1" "7" "2" "0" "AA" "AA" "BB" "BB" "BB" "BB" "BB" "BB" "AA" "BB" 
R4 "4" "0" "1" "5" "AA" "AA" "AB" "BB" "BB" "AA" "BB" "AA" "BB" "BB" 
R5 "0" "5" "3" "2" "AA" "BB" "AA" "AA" "BB" "BB" "NC" "BB" "NC" "BB" 

,或者如果您在目前DF對象替換行列的名稱:

DF[pvalue <= 0.05, ] <- t(apply(DF[pvalue <= 0.05, ], 1, function(x){ 
    x <- gsub(names(x[which.max(as.integer(x[3:4]))+2]), 
      names(x[which.min(as.integer(x[1:2]))]), x) 
})) 

DF 
    AA BB AB NC S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 
R1 0 5 5 0 BB AA AA BB AA AA BB BB BB AA 
R2 5 0 4 1 BB AA BB BB AA AA BB NC AA AA 
R3 1 7 2 0 AA AA BB BB BB BB BB BB AA BB 
R4 4 0 1 5 AA AA AB BB BB AA BB AA BB BB 
R5 0 5 3 2 AA BB AA AA BB BB NC BB NC BB 
R6 4 4 1 1 AB BB AA AA BB AA AA BB BB NC 
+0

在最後一個解決方案中,如果計數數字(DF中的前四列)也需要更新,那麼在代碼中如何實現? – user3354212

+0

AA,BB,AB和NC應該如何?在'gsub'指令'x [1:4] < - c('A','B','C','D')'之後的'apply'函數中替換前4個列... –