我正在使用mtcars数据集来说明我的问题.
例如,我想将数据子集到4缸汽车.我可以这样做:
mtcars %>% filter(cyl == 4)
Run Code Online (Sandbox Code Playgroud)
在我的工作中,我需要传递一个字符串变量作为我的列名.例如:
var <- 'cyl'
mtcars %>% filter(var == 4)
Run Code Online (Sandbox Code Playgroud)
我也做了:
mtcars %>% filter(!!var == 4)
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都得到了空数据帧.
我需要通过逻辑列过滤表(或者更确切地说,通过它的否定),但列的名称可能会有所不同.我事先知道他们的名字很容易:
tb = tibble(
id = 1:4,
col1 = c(TRUE, TRUE, FALSE, FALSE),
col2 = c(TRUE, FALSE, TRUE, FALSE)
)
tb
## # A tibble: 4 x 3
## id col1 col2
## <int> <lgl> <lgl>
## 1 1 TRUE TRUE
## 2 2 TRUE FALSE
## 3 3 FALSE TRUE
## 4 4 FALSE FALSE
colname = quo(col1)
tb %>%
filter(!!colname) # rows where col1 is true
## # A tibble: 2 x 3
## id col1 col2
## …Run Code Online (Sandbox Code Playgroud) 我有一个闪亮的应用程序,要求用户上传的文件(有数据的表格文件),然后将其渲染此文件到表中,用户可以筛选基于一些值numericInput,selectInput和textAreaInput。用户必须选择过滤器,然后按下按钮才能过滤表。
没有顺序过滤,即用户可以填充所有过滤器或仅填充一个。每次用户选择过滤器时,其他过滤器的值都会更新(selectInput输入),这就是我想要的行为。但是,一旦按下过滤器按钮,我就看不到以前的选择,也无法重置过滤器。
我想要实现的是在更新过滤器时保持实际行为,即,一旦我选择一个过滤器并按下过滤器按钮,其他selectInput选择就会自动更新,但我想跟踪过滤器选择,因此用户可以看到他/她选择的过滤器。这正是我所期待的,但每次我按下按钮过滤器时,似乎过滤器选项卡会再次呈现。
这是我的应用程序,
library(shiny)
library(vroom)
library(dplyr)
library(shinycssloaders)
library(shinydashboard)
library(shinydashboardPlus)
library(tidyr)
header <- dashboardHeader()
sidebar <- dashboardSidebar(width = 450,
sidebarMenu(id="tabs",
menuItem("Filtros", tabName="filtros", icon = icon("bar-chart-o")),
uiOutput("filtros")
)
)
body <- dashboardBody(
tabItems(
tabItem(tabName="filtros",
fluidRow(
column(12,dataTableOutput("tabla_julio") %>% withSpinner(color="#0dc5c1"))
)
)
)
)
ui <- dashboardPagePlus(enable_preloader = TRUE, sidebar_fullCollapse = TRUE, header, sidebar, body)
server = function(input, output, session) {
#Create the choices for sample input …Run Code Online (Sandbox Code Playgroud) 我认为这个问题有多种其他变化(例如:here,here ,也许here) - 甚至可能是某个地方的答案。
如何为过滤器函数提供参数。
library(dplyr)
library(lazyeval)
set.seed(10)
data <- data.frame(a=sample(1:10, 100, T))
Run Code Online (Sandbox Code Playgroud)
如果我需要计算数字 1 到 10 的出现次数并显示计数,比如 1、2 和 3,我会这样做:
data %>%
group_by(a) %>%
summarise(n = n()) %>%
filter(a < 4)
Run Code Online (Sandbox Code Playgroud)
给出:
# A tibble: 3 × 2
a n
<int> <int>
1 1 11
2 2 8
3 3 16
Run Code Online (Sandbox Code Playgroud)
现在,我怎样才能把它放到一个函数中?这grp是分组变量。
fun <- function(d, grp, no){
d %>%
group_by_(grp) %>%
summarise_(n = interp(~ n() )) %>%
filter_( grp < no)
# …Run Code Online (Sandbox Code Playgroud) 我正在使用dplyr并创建代码来计算用ggplot绘制的新数据.
我想用这段代码创建一个函数.它应该采用dplyr操作的数据框列的名称.但是,尝试使用列名不起作用.请考虑以下最小例子:
df <- data.frame(A = seq(-5, 5, 1), B = seq(0,10,1))
library(dplyr)
foo <- function (x) {
df %>%
filter(x < 1)
}
foo(B)
Error in filter_impl(.data, dots(...), environment()) :
object 'B' not found
Run Code Online (Sandbox Code Playgroud)
是否有任何解决方案可以使用列的名称作为函数参数?
我希望能够filter(),其中参数值是已经定义的变量。
因此,例如,使用可重现的mtcars数据集:
library(tidyverse)
df <- mtcars
head(df)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#> Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#> Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#> Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 …Run Code Online (Sandbox Code Playgroud)