R 比较两列并更改第三列时如何使用ifelse?

R 比较两列并更改第三列时如何使用ifelse?,r,if-statement,dataframe,compare,R,If Statement,Dataframe,Compare,我仍然觉得R中的ifelse结构有点混乱,我得到了以下数据帧: df <- structure(list(snp = structure(1:11, .Label = c("AL0009", "AL00014", "AL0021", "AL00046", "AL0047", "AS0005", "AS0014", "AS00021", "AS0047", "AS0071", "DR0001" ), class = "factor"), CHROMOSOME = c(1L, 1L, 1L,

我仍然觉得R中的ifelse结构有点混乱,我得到了以下数据帧:

df <- structure(list(snp = structure(1:11, .Label = c("AL0009", "AL00014", "AL0021", "AL00046", "AL0047", "AS0005", "AS0014", "AS00021", "AS0047", "AS0071", "DR0001" ), class = "factor"), CHROMOSOME = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), COUNT_ALLELE = structure(c(1L, 1L, 1L, 3L, 1L, 1L, 1L, 2L, 3L, 3L, 1L), .Label = c("A", "C", "G"), class = "factor"),     OTHER_ALLELE = structure(c(3L, 3L, 2L, 1L, 3L, 2L, 2L, 1L,     1L, 1L, 3L), .Label = c("A", "C", "G"), class = "factor"),     `116601888` = c(0L, 0L, 0L, 2L, 2L, 0L, 0L, 0L, 0L, 0L, 2L     ), `116621563` = c(0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 0L, 0L,     1L), `117253533` = c(0L, 0L, 0L, 2L, 2L, 0L, 0L, 0L, 1L,     0L, 2L), `117423827` = c(1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L,     1L, 1L, 2L)), .Names = c("snp", "CHROMOSOME", "COUNT_ALLELE", "OTHER_ALLELE", "11688", "11663", "11533", "13827" ), row.names = c(NA, 11L), class = "data.frame")

#        snp CHROMOSOME COUNT_ALLELE OTHER_ALLELE 11688 11663 11533 13827
# 1   AL0009          1            A            G     0     0     0     1
# 2  AL00014          1            A            G     0     0     0     1
# 3   AL0021          1            A            C     0     0     0     1
# 4  AL00046          1            G            A     2     1     2     1
# 5   AL0047          1            A            G     2     1     2     1
# 6   AS0005          1            A            C     0     0     0     0
# 7   AS0014          1            A            C     0     0     0     0
# 8  AS00021          1            C            A     0     1     0     0
# 9   AS0047          1            G            A     0     0     1     1
# 10  AS0071          1            G            A     0     0     0     1
# 11  DR0001          1            A            G     2     1     2     2
因此,期望的输出如下所示:

#        snp CHROMOSOME COUNT_ALLELE OTHER_ALLELE 11688 11663 11533 13827
# 1   AL0009          1            A            G    GG    GG    GG    AG
# 2  AL00014          1            A            G    GG    GG    GG    AG
# 3   AL0021          1            A            C    CC    CC    CC    AC
# 4  AL00046          1            G            A    GG    GA    GG    GA
# 5   AL0047          1            A            G    AA    AG    AA    AG
# 6   AS0005          1            A            C    CC    CC    CC    CC
# 7   AS0014          1            A            C    CC    CC    CC    CC
# 8  AS00021          1            C            A    AA    CA    AA    AA
# 9   AS0047          1            G            A    AA    AA    GA    GA
# 10  AS0071          1            G            A    AA    AA    AA    GA
# 11  DR0001          1            A            G    AA    AG    AA    AA

最终,我需要对1.6M行乘以1M列执行此操作,因此我不能简单地使用for循环:(

我倾向于避免使用ifelse。它有一些严重的缺点。以下是效率和简单性之间的折衷:

df[, 5:8] <- lapply(df[, 5:8], function(x, a, b) {
  x[x == 0] <- paste0(b, b)[x == 0]
  x[x == 1] <- paste0(a, b)[x == 1]
  x[x == 2] <- paste0(a, a)[x == 2]
  x
}, a = df$COUNT_ALLELE, b = df$OTHER_ALLELE)
#        snp CHROMOSOME COUNT_ALLELE OTHER_ALLELE 11688 11663 11533 13827
# 1   AL0009          1            A            G    GG    GG    GG    AG
# 2  AL00014          1            A            G    GG    GG    GG    AG
# 3   AL0021          1            A            C    CC    CC    CC    AC
# 4  AL00046          1            G            A    GG    GA    GG    GA
# 5   AL0047          1            A            G    AA    AG    AA    AG
# 6   AS0005          1            A            C    CC    CC    CC    CC
# 7   AS0014          1            A            C    CC    CC    CC    CC
# 8  AS00021          1            C            A    AA    CA    AA    AA
# 9   AS0047          1            G            A    AA    AA    GA    GA
# 10  AS0071          1            G            A    AA    AA    AA    GA
# 11  DR0001          1            A            G    AA    AG    AA    AA

df[,5:8]这里有一个仅使用基本R的选项:

# create some kind of look up data.frame:
look <- with(df, data.frame(
                   comb1 = paste0(OTHER_ALLELE, OTHER_ALLELE),
                   comb2 = paste0(COUNT_ALLELE, OTHER_ALLELE),
                   comb3 = paste0(COUNT_ALLELE, COUNT_ALLELE)))

# replace values in columns 5:8
df[5:8] <- lapply(df[5:8], function(x) look[cbind(1:nrow(look), x + 1L)])
#创建某种查找数据。框架:

看看这些“全部B”和“全部A”是从哪里来的?你能分享一下你尝试过的吗?@Justin我已经调整了代码,应该是COUNT_等位基因和其他_等位基因。我永远都不会理解为什么这么多新手都用
print
来包装所有东西。谁教这个的?@Roland我习惯于打印,因为我在Python中就是这么做的,我知道我可以使用“ca”同样如此。在这种情况下,我应该返回它。我回家后会尝试答案!R在读取-评估-打印循环(REPL)中并不是唯一的。令我惊讶的是,程序员可以容忍没有语言的语言。@Docendiscimus是的,他们应该融化data.frame并避免循环。这两种方法都按预期工作,但基准测试表明您的方法最快!这两种方法都按预期工作,但基准测试表明Roland的答案最快!
library(reshape2)
dfmelt <- melt(df, id.vars = c("snp", "CHROMOSOME", "COUNT_ALLELE", "OTHER_ALLELE"))

dfmelt$code <- paste0(df$OTHER_ALLELE, df$OTHER_ALLELE)
dfmelt[dfmelt$value == 1L,] <- within(dfmelt[dfmelt$value == 1L,], code <- paste0(COUNT_ALLELE, OTHER_ALLELE))
dfmelt[dfmelt$value == 2L,] <- within(dfmelt[dfmelt$value == 2L,], code <- paste0(COUNT_ALLELE, COUNT_ALLELE))
library(data.table)
setDT(df)
dfmelt <- melt(df, id.vars = c("snp", "CHROMOSOME", "COUNT_ALLELE", "OTHER_ALLELE"))
dfmelt[value == 0L, code := paste0(OTHER_ALLELE, OTHER_ALLELE)]
dfmelt[value == 1L, code := paste0(COUNT_ALLELE, OTHER_ALLELE)]
dfmelt[value == 2L, code := paste0(COUNT_ALLELE, COUNT_ALLELE)]
# create some kind of look up data.frame:
look <- with(df, data.frame(
                   comb1 = paste0(OTHER_ALLELE, OTHER_ALLELE),
                   comb2 = paste0(COUNT_ALLELE, OTHER_ALLELE),
                   comb3 = paste0(COUNT_ALLELE, COUNT_ALLELE)))

# replace values in columns 5:8
df[5:8] <- lapply(df[5:8], function(x) look[cbind(1:nrow(look), x + 1L)])