r - 找到向量中的最小值但没有 0

标签 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))

我想做的是找到mindf行但不是 0
我愿意
df<- df%>% rowwise() %>%
  do({
    th <- c(.$t1, .$t2, .$t3,)


    data.frame(., t_s_last = min(th[th > 0))
  })

但它有效但不适用于包含大于 0 的行。
如果行中只有 0(第 5 行),如何使其返回 0?

最佳答案

我们可以使用 applyif/else健康)状况

 apply(df, 1, function(x) if(all(x==0)) 0 else min(x[x> 0]))

或者另一个选项是 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

我们也可以使用 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

关于r - 找到向量中的最小值但没有 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32309445/

相关文章:

R: `ID : Coercing LHS to a list` 在添加 ID 列中,为什么?

r - R中具有二元因变量的面板数据

r - 在调节特定行的同时动态改变多列

r - 在这种情况下如何使用 rbindlist(data) 而不是 do.call(rbind, data)

r - 在多列上使用 tidyr 的 pivot_wider 的问题

r - 根据每组的另一个查找表有条件地为一个数据框插入值?

r - 种子设置 : why is the output different after no change in input

r - 以上标开头的 ggplot2 facet strip 文本

r - 在 R 中使用 SVM 进行一类分类

r - 如何根据一个值过滤远程表?