来自R data.table的唯一排序行单列

时间:2016-04-29 11:02:10

标签: r shiny data.table

我有一个小应用程序,列出了客户,物品和销售。我想从表中生成一个查找列表,但如果我尝试使用keyby对列表进行排序,则会获得两列。这可能非常简单,但我很困惑。代码如下....

library(data.table)

company=c("A","S","W","L","T","T","W","A","T","W")
item=c("Thingy","Thingy","Widget","Thingy","Grommit","Thingy","Grommit","Thingy","Widget","Thingy")
sales=c(120,140,160,180,200,120,140,160,180,200)
salesdt<-data.table(company,item,sales)

server <- function(input, output) {

  output$theCustomersList <- renderUI({
    list(
      selectInput("customer", "Choose a customer:",
                   choices = salesdt[,unique(company), keyby=company]
                   ,selectize=FALSE
                   ,selected="A"
                   )

    )
  })

  output$result <- renderTable(
                    salesdt[company%in%c(input$customer),
                    .(valuesold=sum(sales)), item
                    ]
                  )

}

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      uiOutput("theCustomersList")
    ),


    mainPanel(tableOutput('result'))
  )
)

shinyApp(ui = ui, server = server)

澄清....我的问题是如何更改

salesdt[,unique(company), keyby=company]

获得一列但订购。

2 个答案:

答案 0 :(得分:1)

替换

choices = salesdt[,unique(company), keyby=company]

使用

choices = sort(salesdt[,unique(company)])

或者

choices = sort(unique(salesdt$company))

salesdt[order(company), unique(company)]

答案 1 :(得分:1)

OP没有具体说明他希望公司名称出现在选择中的特定顺序。如果您希望按字母顺序排列公司名称(不需要为此目的使用keyby =),Symbolix给出的答案是完美的。

您还可以按行数(最重要的是首先)订购公司名称

salesdt[, .N, by = company][order(-N), company]
[1] "W" "T" "A" "S" "L"

或按总销售量(再次,最重要的是第一次)

salesdt[, sum(sales), by = company][order(-V1), company]
[1] "W" "T" "A" "L" "S"

在这两种情况下,分两步完成:(1)使用by =计算每个公司的指标(计数或总和),(2)根据需要对结果进行排序,但仅返回公司名称。