替代基本for循环以提高性能

时间:2016-04-16 16:33:42

标签: r performance loops for-loop

我有一个for循环检查三列中是否存在条件。我想找到一种更有效地执行此操作的方法,因为我实际上在一个非常大的数据库中运行类似于此的东西,并且循环需要几个小时。

df <- data.frame(
  Binary1 = c(1,1,1,1,0,1,0,1,0,0),
  Binary2 = c(0,1,0,1,1,1,0,0,1,0),
  Binary3 = c(0,0,0,1,1,1,1,0,0,1))

for(j in 1:nrow(df)) {df$CompoundSignal[j] <- ifelse (  df$Binary1[j] == 1 
                                                      & df$Binary2[j] == 1
                                                      & df$Binary3[j] == 1
                                                      , 1, 0)}

2 个答案:

答案 0 :(得分:2)

您可以使用不带循环的不同方法。以下是其中一些:

as.integer(rowSums(df) == 3)
#[1] 0 0 0 1 0 1 0 0 0 0

pmin(df$Binary1, df$Binary2, df$Binary3) 
#[1] 0 0 0 1 0 1 0 0 0 0

as.integer(df$Binary1 & df$Binary2 & df$Binary3)
#[1] 0 0 0 1 0 1 0 0 0 0

顺便说一下,ifelse是矢量化的,所以你不需要在你的方法中循环。

答案 1 :(得分:0)

这有用吗?

df$CompoundSignal = as.integer(df$Binary1==1 & df$Binary2==1 & df$Binary3==1)