将复杂的条件for循环替换为apply in R

将复杂的条件for循环替换为apply in R,r,loops,apply,R,Loops,Apply,我对R比较陌生,我希望用更雄辩、更快的东西(应用?)来取代我混乱的循环。基本上,我想根据其他矩阵中相同位置的值是否相互匹配来填充一个新矩阵。让我举例说明: >df1 V1 V2 V3 1 A G A 2 T T T 3 C A A 4 G C G >df2 V1 1 A 2 T 3 C 4 G >df3 V1 V2 V3 1 .25 .99 .41 2 .21 .25 .75 3 .35 .65

我对R比较陌生,我希望用更雄辩、更快的东西(应用?)来取代我混乱的循环。基本上,我想根据其他矩阵中相同位置的值是否相互匹配来填充一个新矩阵。让我举例说明:

>df1
  V1 V2 V3
1  A  G  A
2  T  T  T
3  C  A  A
4  G  C  G

 >df2
   V1
1  A
2  T
3  C
4  G

>df3
    V1   V2   V3
1  .25  .99  .41
2  .21  .25  .75
3  .35  .65  .55
4  .75  .21  .11

>newdf <- data.frame(matrix(ncol= ncol(df3), nrow = nrow(df3)))

当我有很多数据时,这是一个非常缓慢和混乱的过程。有没有其他解决方法的建议,比如使用apply系列?谢谢你,很抱歉给我写了这么糟糕的代码

您可以使用
apply
为不匹配的值创建索引,然后从一个值中减去它们

idx <- (!apply(df1, 2, function(x) x == df2))
## alternatively, you can use x != df2 too
## idx <- (apply(df1, 2, function(x) x != df2))

df3[idx] <- 1 - df3[idx]
df3

#     V1   V2   V3
# 1 0.25 0.01 0.41
# 2 0.21 0.25 0.75
# 3 0.35 0.35 0.45
# 4 0.75 0.79 0.11
所以用
来否定这个给出相反的值

!apply(df1, 2, function(x) x == df2)
        V1    V2    V3
[1,] FALSE  TRUE FALSE
[2,] FALSE FALSE FALSE
[3,] FALSE  TRUE  TRUE
[4,] FALSE  TRUE FALSE
然后告诉我们需要更改
df
的哪些值

df3[idx]
[1] 0.01 0.35 0.79 0.45

另一种方法是使
df2
的大小与
df1

df2  <- cbind(df2, rep( df2, ncol( df1 ) - 1))

df1 != df2

df2完美!节省了这么多时间。Thanks@hawkomics-不客气。我已经添加了一种替代方法,但还没有测试哪种方法的可扩展性最好
!apply(df1, 2, function(x) x == df2)
        V1    V2    V3
[1,] FALSE  TRUE FALSE
[2,] FALSE FALSE FALSE
[3,] FALSE  TRUE  TRUE
[4,] FALSE  TRUE FALSE
df3[idx]
[1] 0.01 0.35 0.79 0.45
df2  <- cbind(df2, rep( df2, ncol( df1 ) - 1))

df1 != df2