我有一个名为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)
}
答案 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
- gsub
或apply
/ strsplit
解决方案......