在 R 中添加最小行

Add Min Row in R

我已经阅读了很多类似的问题,但无法使任何代码正常工作。我只是想在我的数据框 (df) 的底部添加一行,该行具有列 2:8 的每列的最小值。下面是我添加总行的代码(有效),但我想要一个最小行。

df[(nrow(df)+ 1),(2:8)] <- colSums(df[,2:8], na.rm=TRUE)

我试图让 matrixStats 包中的 colMins 工作,但由于某种原因不能。如有任何帮助,我们将不胜感激!

我们可以尝试 colMinslibrary(matrixStats)

library(matrixStats)
rbind(df, c(NA,colMins(as.matrix(df[2:8]))))

更新

NA替换为'MIN',

rbind(df, c('MIN',as.list(colMins(as.matrix(df[2:8])))))

或者另一种方法是转换为 matrix 并使用 addmargins

addmargins(`row.names<-`(as.matrix(df[-1]), df$ID), 1, FUN=min)

数据

set.seed(24)
df <- cbind(ID= 1:10,as.data.frame(matrix(sample(1:9, 7*10, 
   replace=TRUE), ncol=7)))

在 base R 中,您可以使用 sapply() 创建列最小值的原子向量,然后 rbind() 将其附加到原始数据。我为第一个值添加了一个 NA,因为我们需要将其添加到原始数据中。

rbind(df, c(NA, sapply(df[2:8], min, na.rm = TRUE)))

显然这假设只有 8 列,因此可以使用 df[-1] 代替 df[2:8]

为了提高速度,我们可以使用 vapply() 而不是 sapply(),因为我们知道结果将是单个数值。

rbind(df, c(NA, vapply(df[-1], min, 1, na.rm = TRUE)))

更新: 回应您对其他答案的评论 - 要在第一列中获得 "MIN" 并在所有其余列中获得最小值,我们可以调整调用命名列表并一次性完成所有操作。这样我们就不会混合 类 列(字符和数字)并最终在结果数据的列中出现意外的 类。

rbind(
    df, 
    c(setNames(list("MIN"), names(df)[1]), lapply(df[-1], min, na.rm = TRUE))
)