Вот один из вариантов с melt
library(data.table)
library(dplyr)
TN <- melt(tempmat[, rid := seq_len(.N)], id.var = 'rid')[,
{i1 <- cumsum(value) > 0
mean(na_if(value[i1][-1], 0), na.rm = TRUE)}, rid]$V1
tempmat[, TN := TN][]
Или с использованием tidyverse
library(tidyverse)
tempmat %>%
mutate(TN = pmap(., ~ c(...) %>%
keep(., cumsum(.) > 0) %>%
tail(-1) %>%
na_if(0) %>%
mean(na.rm = TRUE)))
Или другой вариант - транспонировать набор данных, а затем выполнить colwiseоперация
t(tempmat) %>%
as.data.frame %>%
summarise_all(list(~ mean(na_if(.[cumsum(.) > 0], 0)[-1],
na.rm = TRUE))) %>%
unlist %>%
mutate(tempmat, TN = .)
Или с использованием векторизованного подхода
library(matrixStats)
m1 <- rowCumsums(as.matrix(tempmat)) > 0
m1[cbind(seq_len(nrow(m1)), max.col(m1, 'first'))] <- FALSE
rowMeans(na_if(tempmat * NA^!m1, 0), na.rm = TRUE)
Или с использованием apply
apply(tempmat, 1, FUN = function(x)
mean(na_if(x[cumsum(x) > 0], 0)[-1], na.rm = TRUE))