2017-04-20 21 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个列... –