答案 0 :(得分:1)
我们可以将max.col
与行索引一起使用来获取值。它比apply
SamData$FirstInstAmt <- SamData[-1][cbind(seq_len(nrow(SamData)),
max.col(SamData[-1] != 0, 'first'))]
或者如果我们要使用apply
SamData$FirstInstAmt <- apply(SamData[-1], 1, function(x) x[x !=0][1])
SamData$FirstInstAmt
#[1] -1.4726888 NA 0.3435450 NA -0.8016447
#[6] -1.2115839 NA NA 0.4194970
或将pmap
与dplyr
一起使用
library(dplyr)
library(purrr)
SamData %>%
mutate(FirstInstAmt = pmap_dbl(.[-1], ~ {x <- c(...); x[x != 0][1]}))
或将c_across
与rowwise
一起使用
SamData %>%
rowwise %>%
mutate(FirstInstAmt = {tmp <- c_across(FY12_April:FY12_June)
tmp[tmp!= 0][1]})
或用NA
替换0值,然后使用coalesce
返回第一个非NA
SamData %>%
mutate(FirstInstAmt = coalesce(!!! .[-1] * NA^(!.[-1])))
注意:使用rowwise/c_across
或pmap
或apply
可能会更慢,因为它们是循环。其中最有效的方法是基于索引(max.col
)或在一定程度上基于coalesce/replace