小编sta*_*ant的帖子

data.table中的逐行操作和更新

我最终得到了一个很大的data.table,我必须每行做一次操作.(是的......我知道这显然不是data.table的用途)

R) set.seed(1)
R) DT=data.table(matrix(rnorm(100),nrow=10))
R) DT[,c('a','b'):=list(1:10,2:11)]
R) DT
               V1             V2             V3             V4            V5            V6             V7              V8            V9           V10  a  b
 1: -0.6264538107  1.51178116845  0.91897737161  1.35867955153 -0.1645235963  0.3981058804  2.40161776050  0.475509528900 -0.5686687328 -0.5425200310  1  2
 2:  0.1836433242  0.38984323641  0.78213630073 -0.10278772734 -0.2533616801 -0.6120263933 -0.03924000273 -0.709946430922 -0.1351786151  1.2078678060  2  3
 3: -0.8356286124 -0.62124058054  0.07456498337  0.38767161156  0.6969633754  0.3411196914  0.68973936245  0.610726353489  1.1780869966  1.1604026157  3  4
 4:  1.5952808021 -2.21469988718 -1.98935169586 -0.05380504058  0.5566631987 -1.1293630961  0.02800215878 -0.934097631644 -1.5235668004  0.7002136495  4  5
 5:  0.3295077718  1.12493091814  0.61982574789 -1.37705955683 -0.6887556945  1.4330237017 …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

根据列名合并data.tables

我正在尝试与data.tables进行一些左连接合并.包描述引用

在所有连接中,列的名称无关紧要; x键的列按顺序连接

我明白我可以使用.data.table[data.table:::merge.data.table

我想要的是:合并X和Y指定键(如基础合并中的by.x和by.y, - >为什么要取消它?)

我想我有

DT = data.table(x=rep(c("a","b","c"),each=3),y=c(1,3,6),v=1:9,key="x,y,v")
DT1 = data.frame(x1=c("aa","bb","cc"),y1=c(1,3,6),v1=1:3,key="x1,y1,v1")
Run Code Online (Sandbox Code Playgroud)

我希望这个输出:

#data.table:::merge is masking I don't know how to call the base version of merge anymore
R) {base::merge}(DT,DT1,by.x="y",by.y="y1") 
y x v x1 v1
1 1 a 1 aa  1
2 1 c 7 aa  1
3 1 b 4 aa  1
4 3 a 2 bb  2
5 3 b 5 bb  2
6 3 c 8 bb  2
7 6 b 6 …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

如何将 Rmd 文档转换为 jupyter 笔记本

我想将 rmarkdown.Rmd文档转换为 jupyter notebook .ipynb。我发现从 jupyter 转换为 rmd 很容易使用,如参考页面中所述,但由于某种原因(...),Rstudio团队没有采取其他方式。

例如我想转换

---
title: "Untitled"
author: "statquant"
date: "03/09/2019"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.

When you click the **Knit** button a document will be generated that includes both …
Run Code Online (Sandbox Code Playgroud)

knitr r-markdown jupyter-notebook

13
推荐指数
1
解决办法
6280
查看次数

直接将字符串转换为IDateTime

我正在使用新版本,data.table特别是AWESOME fread功能.我的文件包含作为字符串加载的日期(因为我不知道这样做),看起来像01APR2008:09:00:00.

我需要梳理这些日期时间的data.table,然后排序是有效的投,然后IDateTime格式(或任何ALSE我还不知道).

> strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S")
[1] "2008-04-01 09:00:00"

> IDateTime(strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S"))
        idate    itime
1: 2008-04-01 09:00:00

> IDateTime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S")
Error in charToDate(x) : 
character string is not in a standard unambiguous format 
Run Code Online (Sandbox Code Playgroud)

看起来我做不到DT[ , newType := IDateTime(strptime(oldType, "%d%b%Y:%H:%M:%S"))].

我的问题是:

  1. 有没有一种方法可以直接转换为IDateTimefread,这样我可以排序后有效?
  2. 如果没有,那么知道我希望能够通过此日期时间列对DT进行排序的最有效方法是什么

datetime r data.table

12
推荐指数
1
解决办法
2751
查看次数

是否有可能获得带有foreach的进度条和后端的"多核类型"

使用foreachdoMC后端使用"多核"并行性时(我使用doMC时,我调查了其他包不允许从我想要获取进度条,使用进度包,但任何进度)这适用于Linux终端,即没有tcltk弹出窗口).

鉴于它使用分叉,我可以想象它可能不可能,但我不确定.

预期用途是指示并行加载连接100个文件时的进度(通常在#!Rscript中)

我看过几个帖子,比如在R中使用"foreach()"函数时如何创建进度条?.很高兴为此奖励.

编辑

为有人向我展示500分的赏金

  1. 使用foreach和多核(分叉)类型的并行性
  2. 得到一个进度条
  3. 使用futile.logger获取日志记录

Reprex

# load packages                                                                                                        
library("futile.logger")                                                                                               
library("data.table")                                                                                                  
library("foreach")                                                                                                     
# create temp dir                                                                                                      
tmp_dir <- tempdir()                                                                                                   
# create names for 200 files to be created                                                                             
nb_files <- 200L                                                                                                       
file_names <- file.path(tmp_dir, sprintf("file_%s.txt", 1:nb_files))                                                   
# make it reproducible                                                                                                 
set.seed(1L)                                                                                                           
nb_rows <- 1000L                                                                                                       
nb_columns <- 10L                                                                                                      
# create those 200 files sequentially                                                                                  
foreach(file_i = file_names) %do%                                                                                      
{                                                                                                                      
    DT <- as.data.table(matrix(data = runif(n = nb_rows * nb_columns), nrow …
Run Code Online (Sandbox Code Playgroud)

r domc progress-bar parallel-foreach

12
推荐指数
1
解决办法
1189
查看次数

通过引用传递data.frame并使用rcpp更新它

看看rcpp文档和Rcpp::DataFrame库中我意识到我不知道如何通过引用修改DataFrame.谷歌搜索了一下我在SO上找到了这篇文章,这篇文章在档案上.没有什么明显的,所以我怀疑我会错过一些像"已经是这种情况因为"或"因为它没有意义"的大事.

我尝试了以下编译,但data.frame传递给updateDFByRefR 的对象 保持不变

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
void updateDFByRef(DataFrame& df) {
    int N = df.nrows();
    NumericVector newCol(N,1.);
    df["newCol"] = newCol;
    return;
}
Run Code Online (Sandbox Code Playgroud)

r rcpp

11
推荐指数
1
解决办法
3906
查看次数

无法构建R包"png"Fedora 20

我正在尝试构建R软件包png,repo说libpng需要提供.

我运行Linux Fedora 20发行版

看起来我有它......

[root@localhost bin]# yum install libpng
Loaded plugins: langpacks, refresh-packagekit
Package 2:libpng-1.6.3-3.fc20.x86_64 already installed and latest version
Nothing to do
Run Code Online (Sandbox Code Playgroud)

但是当我尝试安装它时:

> install.packages("png")
Installing package into ‘/home/statquant/R/x86_64-redhat-linux-gnu-library/3.0’
(as ‘lib’ is unspecified)
trying URL 'http://cran.rstudio.com/src/contrib/png_0.1-7.tar.gz'
Content type 'application/x-gzip' length 24990 bytes (24 Kb)
opened URL
==================================================
downloaded 24 Kb

* installing *source* package ‘png’ ...
** package ‘png’ successfully unpacked and MD5 sums checked
** libs
gcc -m64 -std=gnu99 -I/usr/include/R -DNDEBUG …
Run Code Online (Sandbox Code Playgroud)

install r libpng fedora20

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

修改POSIXct对象的时区而不更改显示

我有一个POSIXct对象,并希望更改它的tz属性WITHOUT R来解释它(解释它将意味着改变日期时间在屏幕上的显示方式).

一些背景:我正在使用fasttime来自S.Urbanek 的包,它采用字符串并将其POSIXct快速投射.问题是字符串应该代表"GMT"中的日期时间,而不是我的数据的情况.

我最终得到一个POSIXct对象tz=GMT,实际上是tz=GMT+1,如果我改变时区

attr(datetime, "tzone") <- "Europe/Paris";
datetime  <- .POSIXct(datetime,tz="Europe/Paris"); 
Run Code Online (Sandbox Code Playgroud)

然后它将"显示"为GMT+2(基础值永远不会改变).

编辑:这是一个例子

datetime=as.POSIXct("2011-01-01 12:32:23.234",tz="GMT")
attributes(datetime)
#$tzone
#[1] "GMT"
datetime
#[1] "2011-01-01 12:32:23.233 GMT"
Run Code Online (Sandbox Code Playgroud)

如何在没有R的情况下更改此属性来解释它,又如何更改tzone并仍然显示日期时间"2011-01-01 12:32:23.233"

编辑/解决方案,@ GSee的解决方案相当快,lubridate :: force_tz非常慢

datetime=rep(as.POSIXct("2011-01-01 12:32:23.234",tz="GMT"),1e5)
f <- function(x,tz) return(as.POSIXct(as.numeric(x), origin="1970-01-01", tz=tz))
> system.time(datetime2 <- f(datetime,"Europe/Paris"))
   user  system elapsed 
   0.01    0.00    0.02 
> system.time(datetime3 <- force_tz(datetime,"Europe/Paris"))
   user  system elapsed 
   5.94    0.02    5.98 
identical(datetime2,datetime3)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

timezone r posixct

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

data.table不处理by语句中的integer64

正确使用freaddata.table加载integer64,虽然我的印象是by语句没有正确处理int64.我可能在这里做错了,这是什么?

library(data.table); library(bit64);
test = data.table(x=c(1,2,3),y=c('x','q','q'),ID=as.integer64(c('432706205348805058','432706205348805058','432706205348805059')))

str(test) #the display is wrong (BUT IT IS EXPECTED)
#Classes ‘data.table’ and 'data.frame':  3 obs. of  3 variables:
# $ x : num  1 2 3
# $ y : chr  "x" "q" "q"
# $ ID:Class 'integer64'  num [1:3] 9.52e-280 9.52e-280 9.52e-280
# - attr(*, ".internal.selfref")=<externalptr> 

test # Here it is displayed correctly
#   x y                 ID
#1: 1 x 432706205348805058
#2: 2 q 432706205348805058
#3: 3 …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

如何在Rcpp :: List中访问向量的元素

我很困惑.

以下编译和工作正常:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
List test(){
    List l;
    IntegerVector v(5, NA_INTEGER);
    l.push_back(v);
    return l;
}
Run Code Online (Sandbox Code Playgroud)

在R:

R) test()
[[1]]
[1] NA NA NA NA NA
Run Code Online (Sandbox Code Playgroud)

但是当我尝试IntegerVector在列表中设置时:

// [[Rcpp::export]]
List test(){
    List l;
    IntegerVector v(5, NA_INTEGER);
    l.push_back(v);
    l[0][1] = 1;
    return l;
}
Run Code Online (Sandbox Code Playgroud)

它不编译:

test.cpp:121:8: error: invalid use of incomplete type 'struct SEXPREC'
C:/PROGRA~1/R/R-30~1.0/include/Rinternals.h:393:16: error: forward declaration of 'struct SEXPREC'
Run Code Online (Sandbox Code Playgroud)

r rcpp

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