for循环不起作用,输出错误

时间:2016-04-27 11:38:17

标签: r

我有一个名为M的矩阵,其中每行只有两个可能的字母:

M <- structure(list(id1 = c("AA", "AB", "AA", "AC"), id2 = c("AA", 
"AB", "AA", "CC"), id3 = c("AA", "AA", "AB", "AC"), id4 = c("AA", 
"AB", "AB", "AA"), id5 = c("AA", "BB", "AA", "CC"), id6 = c("AA", 
"AB", "BB", "CC"), id7 = c("AA", "AB", "BB", "CC"), id8 = c("AA", 
"AB", "BB", "AC"), id9 = c("AA", "AB", "AB", "AA")), .Names = c("id1", 
"id2", "id3", "id4", "id5", "id6", "id7", "id8", "id9"), class = "data.frame", row.names = c(NA, 
-4L))
M
  # id1 id2 id3 id4 id5 id6 id7 id8 id9
# 1  AA  AA  AA  AA  AA  AA  AA  AA  AA
# 2  AB  AB  AA  AB  BB  AB  AB  AB  AB
# 3  AA  AA  AB  AB  AA  BB  BB  BB  AB
# 4  AC  CC  AC  AA  CC  CC  CC  AC  AA

我需要替换这些字母,这样,对于每一行,第一行被分配0而第二行被分配 因此对于行2,A = 0,B = 1,对于行5 A = 0,C = 1。

我被告知要使用下面的for循环执行此操作,但它似乎不起作用,我只获得一行的结果。谁能告诉我我做错了什么?

这是我的代码:

for (i in 1:500)
{
   results= M[i,]
   hold=unique(unlist(strsplit(unique(results),"")))
   hold=hold[is.na(hold)==F]
   sort(hold)
   results=gsub(hold[1],"0",results)
   results=gsub(hold[2],"1",results)
}

1 个答案:

答案 0 :(得分:3)

您可以在循环之前定义results并修改循环,使其在每个回合的results右侧写入:

results <- as.matrix(M)
for (i in 1:nrow(M)) {
   hold <- unique(unlist(strsplit(unique(results[i, ]), "")))
   hold <- hold[!is.na(hold)]
   hold <- sort(hold)
   results[i, ] <- gsub(hold[1], "0", results[i, ])
   results[i, ] <- gsub(hold[2], "1", results[i, ])
}

或者使用与apply仅有sub / gsub的略有不同的方法(我在length(u_lett)添加了条件,因为第一行示例数据只有1个字母):

results <- t(apply(M, 1, 
                  function(x) {
                     u_lett <- sort(unique(c(sub("([A-Z])[A-Z]", "\\1", x), sub("[A-Z]([A-Z])", "\\1", x))))
                     x <- gsub(u_lett[1], "0", x)
                     if (length(u_lett)>1) x <- gsub(u_lett[2], "1", x)
                     x
                  }))
results
#     id1  id2  id3  id4  id5  id6  id7  id8  id9 
#[1,] "00" "00" "00" "00" "00" "00" "00" "00" "00"
#[2,] "01" "01" "00" "01" "11" "01" "01" "01" "01"
#[3,] "00" "00" "01" "01" "00" "11" "11" "11" "01"
#[4,] "01" "11" "01" "00" "11" "11" "11" "01" "00"

或者您可以将两者混合起来以获得loop / sub - gsubapply / strsplit解决方案......