找到向量中的min但没有0

Mat*_*981 5 r dplyr

我的df是这样的

  df <- data.frame(t1 = c(10, 20, 30, 1, 0), t2 = c(30, 0, 40, 0, 0), t3 = c(10, 0, 3, 10, 0))
Run Code Online (Sandbox Code Playgroud)

我想要做的是找到min了在df行,但不为0怎么办

df<- df%>% rowwise() %>%
  do({
    th <- c(.$t1, .$t2, .$t3,)


    data.frame(., t_s_last = min(th[th > 0))
  })
Run Code Online (Sandbox Code Playgroud)

但它的工作原理但不适用于包含大于0的行的行.如果行中只有0(第5行),如何返回0?

akr*_*run 4

我们可以apply有条件地if/else使用

 apply(df, 1, function(x) if(all(x==0)) 0 else min(x[x> 0]))
Run Code Online (Sandbox Code Playgroud)

或者另一个选择rowMins来自library(matrixStats). 我们将数据集中的“0”值替换为NA,使用rowMinsna.rm=TRUE并将“Inf”值替换为 0。

 library(matrixStats)
 is.na(df) <- df==0
 v1 <- rowMins(as.matrix(df), na.rm=TRUE)
 v1[is.infinite(v1)] <- 0
 v1
 #[1] 10 20  3  1  0
Run Code Online (Sandbox Code Playgroud)

我们还可以使用if/elsedo

library(dplyr)
df %>%
    rowwise() %>%
    do({th <- unlist(.[.>0])
       data.frame(., t_s_last = if(all(th==0)) 0 else min(th))})
#  t1 t2 t3 t_s_last
#1 10 30 10       10
#2 20  0  0       20
#3 30 40  3        3
#4  1  0 10        1
#5  0  0  0        0
Run Code Online (Sandbox Code Playgroud)