将复杂的条件for循环替换为apply in R
我对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
>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