Kay*_*Kay 5 r dplyr tidyverse rlang
我正在编写我的函数,并希望使用dplyr的filter()函数来选择满足条件的数据帧行.这是我的代码:
library(tidyverse)
df <-data.frame(x = sample(1:100, 50), y = rnorm(50), z = sample(1:100,50), w = sample(1:100, 50),
p = sample(1:100,50))
new <- function(ang,brad,drau){
df%>%filter(!!drau %in% 1:50)%>%select(ang,brad) -> A
return(A)
}
brand <- c("z","w","p")
lapply(1:3, function(i) new(ang = "x", brad = "y", drau = brand[i]))%>%bind_rows()
Run Code Online (Sandbox Code Playgroud)
无论何时我运行此函数,它看起来filter
都不会选择满足条件的任何行.
我怎样才能做到这一点?
更新
出于某种原因,当我不使用`%in%时,这可行;
new <- function(ang,brad,drau){
df%>%filter(!!drau > 50)%>%select(ang,brad) -> A
return(A)
}
lapply(1:3, function(i) new(ang = "x", brad = "y", drau = brand[i]))%>%bind_rows()
Run Code Online (Sandbox Code Playgroud)
但是,每个循环的结果都是相同的.为什么会这样?而且为什么我不能使用%in%
.
我同意@ hrbrmstr的标准评估解决方案.正如@hadley 今天在这里提出的NSE解决方案:
library(tidyverse)
df <-data.frame(x = sample(1:100, 50),
y = rnorm(50),
z = sample(1:100,50),
w = sample(1:100, 50),
p = sample(1:100,50))
new <- function(ang, brad, drau){
ang <- enquo(ang)
brad <- enquo(brad)
drau <- enquo(drau)
df %>% filter(UQ(drau) %in% 1:50) %>%
select(UQ(ang),UQ(brad))
}
brand <- c("z","w","p")
brand <- rlang::syms(brand)
map_df(brand, ~new(ang = x, brad = y, drau = UQ(.x)))
Run Code Online (Sandbox Code Playgroud)
这似乎做你想要的(但它需要你确认):
library(tidyverse)
library(rlang)
set.seed(1492)
xdf <- data_frame(
x = sample(1:100, 50),
y = rnorm(50),
z = sample(1:100,50),
w = sample(1:100, 50),
p = sample(1:100,50)
)
new_df <- function(ang, brad, drau) {
drau <- sym(drau)
filter(xdf, UQE(drau) %in% 1:50) %>%
select(ang, brad)
}
brand <- c("z", "w", "p")
map_df(brand, ~new_df(ang = "x", brad = "y", drau = .x))
Run Code Online (Sandbox Code Playgroud)
尽管有大量的"官方""tidyverse"示例使用df
,但它是stats
pkg中的一个函数,我试图避免再使用它.
由于您使用的tidyverse,还不如趁map_df()
从purrr
.
归档时间: |
|
查看次数: |
1304 次 |
最近记录: |