如何在R中的map函数中使用ifelse

Lau*_*ura 6 if-statement r dplyr purrr

ifelsemap函数内部遇到这句话的问题:

df<-list(mtcars,mtcars)
Run Code Online (Sandbox Code Playgroud)

我想要做的就是以这种方式组织此列表的每个数据框:slice(x,c(n(),2:(n()-1),1))

map(df, ~   slice(.x,c(n(),2:(n()-1),1)))   # it works well. 
Run Code Online (Sandbox Code Playgroud)

但是当我设置条件时,我无法在 ifelse 中执行此操作x$cyl == 4

map(df, ~   ifelse(sum(.x$cyl == 4) > 0, slice(.x,c(n(),2:(n()-1),1)), .x)) # The output is weird
Run Code Online (Sandbox Code Playgroud)

我尝试使用 lapply 做同样的事情,但它不起作用:

lapply(df, function(x) ifelse(sum(x$cyl == 4) > 0, slice(x,c(n(),2:(n()-1),1)),x))
Run Code Online (Sandbox Code Playgroud)

有什么帮助吗?

www*_*www 5

map_if仅当条件为 TRUE 时,我们才能应用该函数。

library(tidyverse)

df <- list(mtcars,mtcars)

df2 <- map_if(df, .p = function(y) any(y$cyl == 4),
                  .f = ~slice(.x, c(n(), 2:(n()-1), 1)))
Run Code Online (Sandbox Code Playgroud)


Ale*_*c B 3

此方法检查列表中的每个 data.frame 中的任何行cyl == 4。如果满足该条件,则返回您想要的切片。否则,data.frame 将原样返回。

library(dplyr)


df<-list(mtcars,mtcars)



lapply(df, function(x) {
  if (any(x$cyl == 4)) {
    slice(x, c(n(), 2:(n()-1), 1)) 
    } else { 
      x 
    }
  })
Run Code Online (Sandbox Code Playgroud)

如果您强烈喜欢map

library(dplyr)
library(purrr)

df<-list(mtcars,mtcars)



map(df, ~ 
  if (any(.x$cyl == 4)) {
    slice(.x, c(n(), 2:(n()-1), 1)) 
    } else { 
      .x 
    }
  )
Run Code Online (Sandbox Code Playgroud)