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 - 如何对 R 中的特定列执行 log2 转换

r - 复杂的长到宽整形算法

r - 合并列,根据其他df更新列,填充NA

r - 使用mutate_at更改多种列类型

r - 选择相似的句子

r - 使用 xts 创建循环

r - 可视化 ANCOVA 包括公式(例如库 HH)

使用 Windows 快捷方式运行 R 脚本

r - 通过与另一列匹配来过滤一列

r - 按位置和条件过滤器访问列