如何通过比较r中不同组的出现来替换数据

时间:2017-04-20 18:25:52

标签: r

我有一个数据框“DF”,其中前四列是S1到S10列中四个唯一字符串的计数数据

        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

因此,如果pvalue <= 0.05,则需要替换R1到R5中的一些数据。 列“AB”和“NC”之间编号最大的字符串将更改为“AA”和“BB”之间编号最小的字符串 例如,在R1行中,最大数字是列“AB”和“NC”之间的列“AB”,最低数字是列“AA”和“BB”之间的列“AA”。因此列中的字符“AB” S1到S10将改为 “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 个答案:

答案 0 :(得分:1)

apply函数中找到新旧值,提取符合最大值和最小值的列的名称

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