小编Mic*_*ael的帖子

如何重新排序data.table列(无需复制)

data.table x鉴于列名称的字符向量,我想重新排序我的列neworder:

library(data.table)
x <- data.table(a = 1:3, b = 3:1, c = runif(3))
neworder <- c("c", "b", "a")
Run Code Online (Sandbox Code Playgroud)

显然我可以这样做:

x[ , neworder, with = FALSE]
# or
x[ , ..neworder]
#            c b a
# 1: 0.8476623 3 1
# 2: 0.4787768 2 2
# 3: 0.3570803 1 3
Run Code Online (Sandbox Code Playgroud)

但这需要再次复制整个数据集.还有另一种方法吗?

r data.table

107
推荐指数
2
解决办法
6万
查看次数

data.table对象的写入函数(过程)

在" 数据分析软件:使用R编程 "一书中,John Chambers强调通常不应该为其副作用编写函数; 相反,函数应返回一个值而不修改其调用环境中的任何变量.相反,使用data.table对象编写好的脚本应该特别避免使用对象赋值<-,通常用于存储函数的结果.

首先,是一个技术问题.想象一个被调用的R函数proc1,它接受一个data.table对象x作为它的参数(除了,可能还有其他参数).proc1返回NULL但x使用修改:=.根据我的理解,proc1调用只是因为承诺的工作方式而proc1(x=x1)制作副本x1.但是,如下所示,原始对象x1仍然被修改proc1.为什么/这是怎么回事?

> require(data.table)
> x1 <- CJ(1:2, 2:3)
> x1
   V1 V2
1:  1  2
2:  1  3
3:  2  2
4:  2  3
> proc1 <- function(x){
+ x[,y:= V1*V2]
+ NULL
+ }
> proc1(x1)
NULL
> x1
   V1 V2 y
1:  1  2 2
2:  1  3 3 …
Run Code Online (Sandbox Code Playgroud)

r data.table

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

为什么expand.grid比data.table的CJ更快?

> system.time(expand.grid(1:1000,1:10000))
   user  system elapsed 
   1.65    0.34    2.03 
> system.time(CJ(1:1000,1:10000))
   user  system elapsed 
   3.48    0.32    3.79 
Run Code Online (Sandbox Code Playgroud)

r data.table

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

将多个ggplots打印成单个pdf,每页多个图

我有一个列表,p其中每个元素p都是ggplot2绘图对象的列表.

我想输出一个包含所有图表的pdf p,以便p[[1]]第1页上的图表,p[[2]]第2页上的图表等等.我怎么能这样做?

下面是一些示例代码,为您提供我正在使用的数据结构 - 为枯燥的图表道歉,我随机选择了变量.

require(ggplot2)
p <- list()

cuts <- unique(diamonds$cut)
for(i in 1:length(cuts)){
    p[[i]] <- list()
    dat <- subset(diamonds, cut==cuts[i])
    p[[i]][[1]] <- ggplot(dat, aes(price,table)) + geom_point() + 
        opts(title=cuts[i])
    p[[i]][[2]] <- ggplot(dat, aes(price,depth)) + geom_point() + 
        opts(title=cuts[i])
}
Run Code Online (Sandbox Code Playgroud)

r ggplot2

27
推荐指数
5
解决办法
4万
查看次数

安全地将data.table转换回data.frame

data.table从对象中删除/删除类,将其转换回data.frame 是最安全的方法是什么?

我问,因为我使用的脚本依赖于以下代码:

newcol.index <- ncol(my.data) +1
my.data[,newcol.index] <- 3
colnames(my.data)[newcol.index] <- "test"
Run Code Online (Sandbox Code Playgroud)

data.table套餐显然不喜欢这个,但它的工作使用类的对象罚款data.frame.

r data.table

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

在数据框中将重叠范围合并到唯一组中

我有一个n行和3列的数据帧

df <- data.frame(start=c(178,400,983,1932,33653),
    end=c(5025,5025, 5535, 6918, 38197),
    group=c(1,1,2,2,3))

df
  start   end group
1   178  5025     1
2   400  5025     1
3   983  5535     2
4  1932  6918     2
5 33653 38197     3
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列df$group2,重新分类重叠的组是相同的.例如,df$group[df$group==1]从178开始并在5025结束.这与df$group[df$group==2]从983开始并在6918结束重叠.我想创建一个新列,现在将组1和2分类为组1(随后,组3作为组2).

结果:

df
  start   end group group2
1   178  5025     1      1
2   400  5025     1      1
3   983  5535     2      1
4  1932  6918     2      1
5 33653 38197     3      2
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

r range overlap dataframe data.table

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

在标题中插入换行符

如何在rmarkdown文档的标题中插入换行符?这不起作用:

---
title: "title \break subtitle"
output: pdf_document 
---`
Run Code Online (Sandbox Code Playgroud)

r knitr r-markdown

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

为什么 as.vector 深度复制矩阵?

使用top,我在以下代码块的注释中指定的特定点手动测量了以下内存使用情况:

x <- matrix(rnorm(1e9),nrow=1e4) 
#~15gb
gc()
# ~7gb after gc()
y <- as.vector(x)
gc()
#~15gb after gc()
Run Code Online (Sandbox Code Playgroud)

很明显,这rnorm(1e9)是一个 ~7gb 的向量,然后被复制以创建矩阵。gc()删除原始向量,因为它没有分配给任何东西。as.vector(x)然后强制并将数据复制到向量。

我的问题是,为什么这三个对象不能都指向同一个内存块(至少在一个被修改之前)?矩阵真的只是一个带有一些额外元数据的向量吗?

这是 R 版本 3.6.2

编辑:也在 4.0.3 中进行了测试,结果相同。

r

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

strptime无法正确识别AM/PM字符串

我在使用函数strptime()时遇到了一些意想不到的事情.我所拥有的日期格式包括"1/22/2013 11:00:00 PM".我使用的格式是"%m /%d /%Y%I:%M:%S%p".

代码如下.

strptime("1/22/2013 11:00:00 p.m",format="%m/%d/%Y %I:%M:%S %p")
[1] NA
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用

strptime("1/22/2013 11:00:00 pm",format="%m/%d/%Y %I:%M:%S %p")
[1] "2013-01-22 23:00:00"
Run Code Online (Sandbox Code Playgroud)

我得到了适当的结果.

因此,该特征缺乏检测pm及其变化(例如pm等)以代替PM或pm.这是R中的错误吗?

RI的版本在Windows 7 32位上使用R.14.2

r strptime

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

将整个包裹传递到雪群

我正在尝试并行化(使用snow::parLapply)一些依赖于包的代码(即,除了之外的包snow).调用的函数中引用的对象parLapply必须使用显式传递给集群clusterExport.有没有办法将整个包传递给集群,而不是必须明确命名每个函数(包括用户函数调用的包的内部函数!)clusterExport

parallel-processing scope r

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