繁体   English   中英

在整行上使用purrr rowwise而不是apply()

[英]Using purrr rowwise instead of apply() on whole row

我想用purrr函数替换apply() (和它的衍生物)。

我有一个像这样的data.frame:

> df
  V1 V2 V3
1 NA  2  3
2  2 NA  3
3  3  3 NA

我想逐行应用两个函数: min(x, na.rm = T)which.min(x)并将结果作为数据帧返回。

如果我知道我可以做多少列,例如:

pmap_dfr(df, function(V1, V2, V3) {data.frame(min = pmin(V1, V2, V3, na.rm = T),
                                              where = which.min(c(V1, V2, V3)))})

  min where
1   2     2
2   2     1
3   3     1

我怎样才能使pmap()或任何其他purrr函数将整行作为参数,就像apply()一样?

func <- function(x) {data.frame(min = min(x, na.rm = T), where = which.min(x))}

> Reduce(rbind, apply(df,1, func))
    min where
V2    2     2
V1    2     1
V11   3     1


我可能只是错过了一个功能或一些技巧。 谢谢你的帮助。

如果使用省略号,则您的解决方案适用于所有列。

pmap_dfr(df, ~data.frame(min = min(..., na.rm = TRUE), where = which.min(c(...)))) 

  min where
1   2     2
2   2     1
3   3     1

一种可能性是:

df %>%
 mutate(min = invoke(pmin, na.rm = TRUE, .),
        where = max.col(!is.na(-.)[, 1:length(.)], ties.method = "first"))

  V1 V2 V3 min where
1 NA  2  3   2     2
2  2 NA  3   2     1
3  3  3 NA   3     1

或者,如果您想保留最后两列:

df %>%
 transmute(min = invoke(pmin, na.rm = TRUE, .),
        where = max.col(!is.na(-.)[, 1:length(.)], ties.method = "first"))

不是purrr -solution,而是data.table oneliner。

library(data.table)

dt <- fread("row V1 V2 V3
1 NA  2  3
2  2 NA  3
3  3  3 NA")

melt(dt, id.vars = "row")[ , .SD[which.min(value)], by = row]
  row variable value 1: 1 V2 2 2: 2 V1 2 3: 3 V1 3 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM