Lau*_*ura 6 if-statement r dplyr purrr
我ifelse在map函数内部遇到这句话的问题:
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)
有什么帮助吗?
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)
此方法检查列表中的每个 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)