我有一个数据框“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
有点复杂。感谢您的帮助。
答案 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