mapply r 中的 ifelse 语句

ifelse statement in mapply r

我正在使用 mapply 查找所有情况下一系列索引的总和:

score = mapply(function(x, y, z) sum(df[x, y:z]), seq_len(nrow(df)), df$index, df$index+10)

如何向 mapply 添加 ifelse 语句,使其仅在 df$index >5 时才应用该函数,否则总和为 0?

这应该可以工作

mapply(function(x, y, z) if (y > 5) sum(df[x, y:z]) else 0, 
         seq_len(nrow(df)), df$index, df$index+10)

或者您可以通过乘以 (y > 5) 来避免 if/else,因此 index > 5 将乘以 1 (TRUE) 得到 sum(df[x, y:z])index <= 5 将乘以 0 (FALSE) 得到 0.

mapply(function(x, y, z) sum(df[x, y:z]) * (y > 5), 
        seq_len(nrow(df)), df$index, df$index+10)

只需包装 ifelse 就可以了

mapply(function(x, y, z) ifelse(y > 5, sum(df[x, y:z]), 0), 
             seq_len(nrow(df)), df$index, df$index+10)

一个更好的选择是 pre-assign 基于 'index' 值将小于或等于 5 的那些 'index' 设为 0。应该更有效率

i1 <- df$index > 5
score[!i1] <- 0
score[i1] <- mapply(function(x, y, z) sum(df[x, y:z]),
                     seq_len(nrow(df))[i1], df$index[i1], df$index[i1] + 10)