我试图将我对plyr的理解转移到dplyr,但我无法弄清楚如何按多列分组.
# make data with weird column names that can't be hard coded
data = data.frame(
asihckhdoydkhxiydfgfTgdsx = sample(LETTERS[1:3], 100, replace=TRUE),
a30mvxigxkghc5cdsvxvyv0ja = sample(LETTERS[1:3], 100, replace=TRUE),
value = rnorm(100)
)
# get the columns we want to average within
columns = names(data)[-3]
# plyr - works
ddply(data, columns, summarize, value=mean(value))
# dplyr - raises error
data %.%
group_by(columns) %.%
summarise(Value = mean(value))
#> Error in eval(expr, envir, enclos) : index out of bounds
Run Code Online (Sandbox Code Playgroud)
将plyr示例翻译成dplyr-esque语法我错过了什么?
编辑2017:Dplyr已更新,因此可以使用更简单的解决方案.查看当前选择的答案.
我想在一个内部引用一个未知的列名summarise.dplyr 0.3允许使用变量引用列名称中引入的标准评估函数,但是当您base在例如a中调用R函数时,这似乎不起作用summarise.
library(dplyr)
key <- "v3"
val <- "v2"
drp <- "v1"
df <- data_frame(v1 = 1:5, v2 = 6:10, v3 = c(rep("A", 3), rep("B", 2)))
Run Code Online (Sandbox Code Playgroud)
df看起来像这样:
> df
Source: local data frame [5 x 3]
v1 v2 v3
1 1 6 A
2 2 7 A
3 3 8 A
4 4 9 B
5 5 10 B
Run Code Online (Sandbox Code Playgroud)
我想放弃v1,按v3分组,并为每个组加上v2:
df %>% select(-matches(drp)) %>% group_by_(key) %>% summarise_(sum(val, na.rm = TRUE))
Error in …Run Code Online (Sandbox Code Playgroud) 我正在编写一个新的Shiny应用程序,我想通过使用dplyr命令进行数据操作来保持在Hadleyverse中.我希望Shiny打印一个表格,根据用户可以选择的变量仅显示前3个观察结果.例如,一个用户可能希望在收到的奖励数量方面看到前三名员工,而另一个用户希望在获得的奖励积分数量方面看到前三名.
在我最近的尝试中,我有这个为ui.R:
library(shiny)
shinyUI(fluidPage(
verticalLayout(
tableOutput("tbl"),
selectInput("top3", label = h4("Quantity"),
choices = list("Number of awards" = "NumberOfAwards",
"Total points awarded" = "TotalAwarded")),
tableOutput("t3")
)))
Run Code Online (Sandbox Code Playgroud)
这对于server.R:
library(dplyr)
library(shiny)
shinyServer(function(input, output) {
employeestats <- read.table(header=TRUE, text='
Employee NumberOfAwards TotalAwarded
Al 3 10
Betty 6 20
Chuck 2 5
Donna 4 15
Ed 0 0
')
output$tbl <- renderTable({
employeestats
},include.rownames=TRUE)
datasetInput <- reactive({employeestats})
output$t3 <- renderTable({
head(datasetInput() %>% arrange(desc(input$top3)),n=3)
},include.rownames=TRUE)
})
Run Code Online (Sandbox Code Playgroud)
在Shiny之外,命令
head(employeestats %>% arrange(desc(NumberOfAwards)),n=3)
Run Code Online (Sandbox Code Playgroud)
给出前三名获奖者的答案.在Shiny中,完整的表和选择框打印时没有Top 3表,我收到消息"eval中的错误(替换(expr),envir,enclos):不能安排类'NULL'的列".我知道这与使用非标准函数的Shiny和dplyr有关,如果R看到NumberOfAwards或字符串"NumberOfAwards",它可能会有所不同.我尝试过像deparse(substitute())这样的东西,使用数字来表示要排列的列等,但没有成功.这不必详细说明; 例如,我不关心第三名的关系.
有任何想法吗?谢谢您的帮助.
我有一个闪亮的应用程序,它需要一个数据帧,并group_by从dplyr. 我可以让它接受单个组,但我希望它selectInput接受多个分组变量。
selectInput我可以通过添加另一个,然后将其传递给语句来解决这个问题group_by,但我希望它扩展到任意数量的变量。因此我需要单个参数selectInput来接受多个参数。
仅添加multiple = TRUE不会以可以理解的方式传递变量group_by,并且我现在无法适应这个答案group_by_,该答案已被弃用
笔记,
此应用程序的完整版本使用fileInput,而不是硬编码数据集,因此调用renderUI、 和reactive
library(shiny)
library(DT)
library(dplyr)
ui <- fluidPage(
titlePanel("app"),
sidebarLayout(
sidebarPanel(
uiOutput("groups")
),
mainPanel(
DT::dataTableOutput("summary")
)
)
)
server <- function(input, output) {
mydata <- reactive({structure(list(School = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 1L, 1L, 2L, 2L), .Label = c("School1", "School2"), class = "factor"),
Town = structure(c(1L, 1L, …Run Code Online (Sandbox Code Playgroud) 使用Shiny时,我无法在dplyr工作中获得group_by.似乎dplyr无法将Shiny的输入$ var识别为表中的有效字段.
在这个例子中,我希望ui.R中的"level"输入决定分组的内容.
在ui.RI有:
library(shiny)
shinyUI(fluidPage(
titlePanel("Orders"),
sidebarLayout(
sidebarPanel(
selectInput("Region_Input", label = h5("Choose a Region"),
choices = list("A", "B")),
radioButtons("level", "What level do you want to see:",
list("item", "category"))
),
mainPanel(
verbatimTextOutput("Level_Select"),
tableOutput(outputId="table")
))))
Run Code Online (Sandbox Code Playgroud)
在server.RI中有:
library(shiny)
library(dplyr)
OrderItems <- data.frame(Region = c('A','A','A','A','A','A','B','B','B','B','B','B','B'),
item = c('Item A','Item B','Item C','Item D','Item E',
'Item A','Item B','Item C','Item D','Item E',
'Item A','Item B','Item C'),
category = c('Cat 1','Cat 1','Cat 1','Cat 2','Cat 2',
'Cat 1','Cat 1','Cat 1','Cat 2','Cat 2',
'Cat 1','Cat 1','Cat 1'))
shinyServer(
function(input, …Run Code Online (Sandbox Code Playgroud)