【问题标题】:Using purrr rowwise instead of apply() on whole row在整行上使用 purrr rowwise 而不是 apply()
【发布时间】:2019-09-28 03:39:46
【问题描述】:

我想用 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()does 一样?

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


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

【问题讨论】:

    标签: r apply purrr


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      一种可能是:

      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"))
      

      【讨论】:

      • 您可以使用transmute 只保留最后一行。
      【解决方案3】:

      不是purrr-解决方案,而是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
      

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-01
        • 2018-04-04
        • 1970-01-01
        相关资源
        最近更新 更多