【问题标题】:Unique sorted rows single column from R data.table [closed]来自R data.table的唯一排序行单列[关闭]
【发布时间】:2016-04-29 11:02:09
【问题描述】:

我有一个小应用程序,它列出了客户、商品和销售情况。我想从表中生成一个查找列表,但如果我尝试使用 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]

得到一列但已排序。

【问题讨论】:

  • 我不确定您的问题到底是什么。也许只使用choices = unique(company)
  • 该公司在 data.table 中被引用.....在现实世界中,我正在导入的 CSV 中有 40k 行,我需要从那里获得唯一列表。
  • 你问为什么你得到两列,salesdt[,unique(company), keyby=company] 正在生成两列。所以你必须改变这一行。
  • 是的,我明白....抱歉,如果我没有说清楚。我的问题是如何更改它以获得一列但有序...如果我省略 keyby 我得到一列但它不是无序的。

标签: r shiny data.table


【解决方案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) 根据需要对结果进行排序,但仅返回公司名称。

【讨论】:

  • 显示其他排序选项的好主意。
  • Uwe.... 是的,感谢其他选项。很有帮助。
【解决方案2】:

替换

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

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

或者

choices = sort(unique(salesdt$company))

或者

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

【讨论】:

  • 谢谢.....三个是我在这种情况下寻找的答案
  • 受您的回答启发,我想知道如果使用更大的data.table,三种替代方案中最快的是什么。您可能会发现结果很有趣stackoverflow.com/questions/36953026/…
  • @Martyn - 在他的链接问题中查看 Uwe 的基准 - 如果速度是一个问题,可能会有用。
  • @Martyn 建议使用salesdt[,logical(1), keyby=company]$company 的评论。所以我重复了我的基准测试,结果证明这是最快的解决方案。
  • 谢谢大家......精彩的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2017-10-21
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多