min for each row with dataframe in R

心不动则不痛 提交于 2020-02-14 02:42:05

问题


I'm try to do a simple minimum across multiple columns in a data frame but the min function automatically returns the min across the whole of each column rather than for each row separately. I'm sure I'm missing something really simple here? Any ideas much appreciated.

x<-c(1,2,7)
y<-c(1,5,4)
minIwant <- c(1,2,4)
df <- data.frame(x,y,minIwant)
df$minIget <- min(df$x,df$y)
df
  x y minIwant minIget
1 1 1        1       1
2 2 5        2       1
3 7 4        4       1

回答1:


You can use apply to go through each row

apply(df, 1, FUN=min)

Where 1 means to apply FUN to each row of df, 2 would mean to apply FUN to columns.




回答2:


We could use pmin, which finds the parallel minima of sets of values. Since our df is technically a list, we will need to run it via do.call.

df$min <- do.call(pmin, df)

which gives

df
#   x y min
# 1 1 1   1
# 2 2 5   2
# 3 7 4   4

Data:

df <- data.frame(x = c(1, 2, 7), y = c(1, 5, 4))

Furthermore, if na.rm = TRUE is needed, you can do

df$min <- do.call(pmin, c(df, na.rm = TRUE))



回答3:


We could also use rowMins from library(matrixStats)

library(matrixStats)
df$minIwant <- rowMins(as.matrix(df))



回答4:


Just want to add on how you can also do this with dplyr.

library(dplyr)

x<-c(1,2,7)
y<-c(1,5,4)
df <- data.frame(x,y)

df %>% rowwise() %>% mutate(minIget = min(x, y))
# A tibble: 3 x 3
    x     y   minIget
  <dbl> <dbl>   <dbl>
1    1.    1.      1.
2    2.    5.      2.
3    7.    4.      4.


来源:https://stackoverflow.com/questions/34683234/min-for-each-row-with-dataframe-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!