使用pmin

时间:2018-03-26 10:46:23

标签: r dplyr

给出样本df(实际数据包含> 100列)

library(tidyverse)

df <- data.frame( x1 = runif(10),
                  x2 = runif(10),
                  y1 = runif(10),
                  y2 = runif(10) 
                  )

如果我想要包含&#39; x&#39;的所有列的最小值,则以下内容将起作用:

df %>% mutate( minx = pmin( x1, x2, na.rm = TRUE ) )
          x1         x2         y1         y2       minx
1  0.2524359 0.66834400 0.42970192 0.89407768 0.25243588
2  0.8854106 0.40131771 0.10842259 0.08260381 0.40131771

但是,当我想要选择包含&#39; x&#39; with contains(),但是以下失败....

df %>% mutate( minx = pmin( contains("x"), na.rm = TRUE ) )
Error in mutate_impl(.data, dots) : 
  Evaluation error: Variable context not set.

为什么不能使用contains()来选择用于pmap的列?我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

使用基础R

df$minx <- apply(df[, grepl('x', names(df))], 1, min)


dplyr解决方案可能是

library(dplyr)
df %>% mutate(minx = do.call(pmin, select(df, matches("x."))))

答案 1 :(得分:3)

这是一个选项

library(tidyverse)
df %>% 
   select(contains("x")) %>%
   reduce(pmin) %>%
   mutate(df, minx = .)

或者@Wimpel在评论中提到,select可以嵌套在mutate来电

df %>%
   mutate(minx = select(., contains("x")) %>% 
                    reduce(pmin, na.rm = TRUE))