小编Mat*_*ill的帖子

将data.table列快速连接到一个字符串列中

给定a中列名的任意列表data.table,我想将这些列的内容连接成存储在新列中的单个字符串.我需要连接的列并不总是相同的,所以我需要生成表达式来动态执行.

我有一种潜在的怀疑,我使用这个eval(parse(...))电话的方式可以用更优雅的东西代替,但下面的方法是我迄今为止能够获得的最快的方法.

有1000万行,这个样本数据需要大约21.7秒(基数R paste0需要稍长一些 - 23.6秒).我的实际数据有18-20列被连接,最多有1亿行,因此减速变得更加不切实际.

有什么想法可以加快速度吗?


目前的方法

library(data.table)
library(stringi)

RowCount <- 1e7
DT <- data.table(x = "foo",
                 y = "bar",
                 a = sample.int(9, RowCount, TRUE),
                 b = sample.int(9, RowCount, TRUE),
                 c = sample.int(9, RowCount, TRUE),
                 d = sample.int(9, RowCount, TRUE),
                 e = sample.int(9, RowCount, TRUE),
                 f = sample.int(9, RowCount, TRUE))

## Generate an expression to paste an arbitrary list of columns together
ConcatCols <- c("x","a","b","c","d","e","f","y")
PasteStatement <- stri_c('stri_c(',stri_c(ConcatCols,collapse = ","),')')
print(PasteStatement) …
Run Code Online (Sandbox Code Playgroud)

r concatenation data.table

21
推荐指数
2
解决办法
2431
查看次数

根据高度为山脊线添加颜色渐变

我想根据区域的高度而不是 X 轴使用渐变填充颜色为山脊线图着色。它会是这样的:

library(ggplot2)
library(ggridges)   
ggplot(lincoln_weather, aes(x = `Mean Temperature [F]`, y = `Month`, fill = stat(x))) +
      geom_density_ridges_gradient(scale = 3, size = 0.3, rel_min_height = 0.01) +
      scale_fill_viridis_c(name = "Temp. [F]", option = "C") +
      labs(title = 'Temperatures in Lincoln NE')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

但在这里,我不是根据 x 轴填充渐变,而是希望对所有曲线使用相同的垂直渐变,因此曲线越高,颜色越深。因此,峰值的颜色会较深,而基线附近的颜色会较浅。

PD:我用geom_ridgeline()的是我的图geom_density_ridges_gradient(),但我认为这个例子更清楚地说明了问题。并且也有负值。

PD2:我知道这里有一个类似的问题“已解决” 。但它已经过时了,因为如果您从建议的包中检查 github,就会出现一个问题,指出所需的函数不起作用,因为它基于另一个已弃用的函数。

r ggplot2 ggridges

11
推荐指数
2
解决办法
1276
查看次数

R 和 Sparklyr:为什么简单的查询这么慢?

这是我的代码。我在数据块中运行它。

library(sparklyr)
library(dplyr)
library(arrow)

sc <- spark_connect(method = "databricks")
tbl_change_db(sc, "prod")
trip_ids <- spark_read_table(sc, "signals",memory=F) %>% 
            slice_sample(10) %>% 
            pull(trip_identifier)
Run Code Online (Sandbox Code Playgroud)

尽管我只查询 10 个样本,但该代码非常慢,需要几个小时才能运行。这是为什么?有没有办法提高性能?

谢谢你!

r apache-spark sparklyr

10
推荐指数
1
解决办法
583
查看次数

将%chin%用于自动索引data.table的子集字符列是否会提高速度?

TLDR:当使用更新版本的data.table使用自动索引时,使用%chin%在字符列上对data.table进行子集是否有任何好处?

在过去,使用%chin%data.table代替%in%对特征向量子集化时产生了显著加速.在较新版本中data.table,子设置时会在非键列上自动创建辅助索引.这些指数的创建和使用似乎使得之间存在任何速度差异,%chin%并且%in%无关紧要.

展望未来,是否存在使用数据%chin%子集的情况.表格仍将提高速度,或者我可以%in%在将来使用?


更新:关于PR#2494的对话:对复合查询更好的子集化优化似乎支持一种理解,即在data.table调用环境中进行求值时,执行方法%chin%已经从根本上改变了.

对于用于对表进行多次子集化的列的情况,通过自动索引会大幅提高性能,但是当仅使用一次时(因此不会从生成索引所花费的时间中获益),关闭自动索引有时会略微提高结果.

我会把这个开放几天,但为了后代,我可能会把它变成一个答案.


数据生成和基准测试

生成的数据由两个不平衡样本的随机排序组合组成:

  • 1000万个单字符串,26个可能的唯一值
  • 100万个四个字符串,456,976个可能的唯一值

这里的目的是代表非正态变量,这些变量由少数常见值支配,但具有许多不太常见的可能性.

library(data.table)
library(microbenchmark)
set.seed(1234)

## Create a vector of 1 million 4 character strings
## with 456,976 possible unique values 
DiverseSize <- 1e6
Diverse <- paste0(sample(LETTERS,DiverseSize,replace = TRUE),
                  sample(letters,DiverseSize,replace = TRUE),
                  sample(letters,DiverseSize,replace = TRUE),
                  sample(letters,DiverseSize,replace = TRUE))

## Create a vector of 10 …
Run Code Online (Sandbox Code Playgroud)

r data.table

7
推荐指数
1
解决办法
800
查看次数

如何从R Shiny中的数据表中删除第一列(索引)

我想知道是否有办法从 Shiny 的数据表中删除索引列(第一列)。

例如,名称列之前的 (1, 2, 3)列如下面的屏幕截图所示:

在此处输入图片说明

下面是我的代码:

header <- dashboardHeader(
  title = "Test"
)

sidebar <- dashboardSidebar(
)

body <- dashboardBody(
            box(title = "Test", width = 7, status = "warning", DT::dataTableOutput("df"))
)

# UI
ui <- dashboardPage(header, sidebar, body)

# Server
server <- function(input, output, session) {

  output$df = DT::renderDataTable(df, options = list(
    autoWidth = TRUE,
    columnDefs = list(list(width = '10px', targets = c(1,3)))))
    }

# Shiny dashboard
shiny::shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

提前致谢。

html css r shiny dt

7
推荐指数
1
解决办法
3491
查看次数

R 中箭头数据集过滤表达式的正确语法

我正在尝试使用arrow(最近实现的) DataSet API 将文件目录读入内存,并利用c++后端来过滤行和列。我想arrow直接使用包函数,而不是样式动词的包装函数dplyr。截至目前,这些函数还处于其生命周期的早期阶段,因此我很难找到一些说明语法的示例。

为了理解语法,我创建了一个非常小的测试示例。前两个查询按预期工作。

library(arrow) ## version 4.0.0

write.csv(mtcars,"ArrowTest_mtcars/mtcars.csv")
## Define a dataset object
DS <- arrow::open_dataset(sources = "ArrowTest_mtcars", format = "text")

## Generate a basic scanner 
AT <- DS$NewScan()$UseThreads()$Finish()$ToTable()
head(as.data.frame(AT), n = 3)
##                      mpg cyl disp  hp drat    wt  qsec vs am gear carb
## 1         Mazda RX4 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## 2     Mazda RX4 Wag 21.0   6  160 110 …
Run Code Online (Sandbox Code Playgroud)

r apache-arrow

7
推荐指数
1
解决办法
1277
查看次数

使用 plotlyProxy 按名称删除跟踪(或在响应式上下文中访问输出模式)

我正在尝试使用该plotlyProxy()功能(此处记录)来允许闪亮应用程序的用户以最小的延迟添加和删除跟踪。

添加跟踪证明相对简单,但我很难弄清楚如何按名称删除跟踪(我只看到按跟踪编号删除的记录示例)

有没有办法使用名称删除痕迹plotlyProxy()

如果没有,有没有办法可以解析输出对象以推导出与给定名称相关联的跟踪编号?

我可以使用标准模式索引在交互式 R 会话中确定给定名称的关联跟踪号,但是当我尝试在闪亮的应用程序中应用相同的逻辑时,我收到一个错误:“$.shinyoutput 中的错误:从不允许闪亮的输出对象。”

下面是一个最小的例子。观察Remove按钮的观察者都没有实际工作,但他们应该对我试图实现的功能提出一个想法。


library(shiny)
library(plotly)

ui <- fluidPage(
  textInput("TraceName", "Trace Name"),
  actionButton("Add","Add Trace"),
  actionButton("Remove","Remove Trace"),
  plotlyOutput("MyPlot")
)

server <- function(input,output,session) {

  ## Creaing the plot
  output$MyPlot <- renderPlotly({
    plot_ly() %>%
      layout(showlegend  = TRUE)
  })

  ## Adding traces is smooth sailing
  observeEvent(input$Add,{
    plotlyProxy("MyPlot", session) %>%
      plotlyProxyInvoke("addTraces", list(x = rnorm(10),y = rnorm(10),
                                          type = "scatter",mode = "markers",
                                          name = input$TraceName))
  })

  ## Ideal …
Run Code Online (Sandbox Code Playgroud)

r shiny plotly r-plotly

5
推荐指数
1
解决办法
1908
查看次数

UPSERT多记录MSSQL

我目前有一个MySQL服务器,但目前正在迁移到MS SQL Server。

我试图在C#应用程序的表中每批插入很多(2000)或记录。我想复制MySQL的“ REPLACE INTO”(替换)(UPSERT),如果记录存在,我想更新它,如果记录不存在,我想插入它。我目前有一个这样的声明:

REPLACE INTO tablename (keycol, col1, col2)
VALUES ('A','B','C'),
       ('C','D','E'),
       ('F','G','H'),
       ('I','J','K');
Run Code Online (Sandbox Code Playgroud)

有些记录将存在,而另一些则不存在。另外,该语句将在许多不同的表上运行,并且值是在运行时构建的(通过动态循环遍历每个字段),因此在编译时表的结构未知。

我怀疑我是否可以有效地使用MERGE,因为该批次中的某些记录将存在而一些记录将不存在,并且由于我不知道事前的表格结构以及我正在更新批次的事实。 2000条记录,出于性能原因,我不想使用子查询。

最好的解决方案的任何帮助将不胜感激。

mysql sql-server merge upsert

2
推荐指数
2
解决办法
1130
查看次数

R:设置初始条件的for循环的dplyr解决方案

我有一个数据,一年有40天和一些数据

set.seed(123)
df <- data.frame(day = 1:40,rain = runif(40,min = 0, max = 3), petc = runif(40, min = 0.3, max = 8),swc = runif(40, min = 27.01, max = 117.43))
Run Code Online (Sandbox Code Playgroud)

我想计算每天另一个名为aetc的变量,计算方法如下:

SW.ini <- 2 # setting some initial values 
SW.max <- 5
SW.min <- 0
Run Code Online (Sandbox Code Playgroud)

第1天,

1)确定一个名为的变量 PAW(day1) = SW.ini + rain(day1)

2)如果PAW(day1) >= SWC(day1), aetc(day1) = petc(day1);

If `PAW(day1) < SWC(day1), aetc(day1) = PAW(day1)/SWC(day1) * petc(day1)`
Run Code Online (Sandbox Code Playgroud)

3)检查是否 aetc(day1) > PAW(day1). If yes, aetc(day1) = paw(day1)

4)更新 …

r rcpp dplyr data.table purrr

2
推荐指数
1
解决办法
197
查看次数