我的问题与引用分配和复制分配有关data.table.我想知道是否可以通过引用删除行,类似于
DT[ , someCol := NULL]
Run Code Online (Sandbox Code Playgroud)
我想知道
DT[someRow := NULL, ]
Run Code Online (Sandbox Code Playgroud)
我想有一个很好的理由说明为什么这个功能不存在,所以也许你可以指出一个很好的替代通常的复制方法,如下所示.特别是,从我的例子(data.table)开始,
DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
# x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 …Run Code Online (Sandbox Code Playgroud) 在" 数据分析软件:使用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) 在测试我的代码时,我发现了以下内容:如果我将data.table分配DT1给DT并在DT之后进行DT1更改,则使用它进行更改.所以DT,DT1似乎是内部联系的.这是预期的行为吗?虽然我不是编程专家,但这对我来说是错误的,并且用简单的R变量或a来测试它data.frame,我无法重现这种行为.这里发生了什么事?
DF <- data.frame(ID=letters[1:5],
value=1:5)
DF1 <- DF
all.equal(DF1, DF)
[1] TRUE
DF[1, "value"] <- DF[1, "value"]*2
all.equal(DF1, DF)
[1] "Component 2: Mean relative difference: 1"
library(data.table)
data.table 1.7.1 For help type: help("data.table")
DT <- data.table(ID=letters[1:5],
value=1:5)
DT1 <- DT
all.equal(DT1, DT)
[1] TRUE
DT[, value:=value*2]
ID value
[1,] a 2
[2,] b 4
[3,] c 6
[4,] d 8
[5,] e 10
all.equal(DT1, DT)
[1] …Run Code Online (Sandbox Code Playgroud) R具有按值传递的语义,可以最大限度地减少意外的副作用(这是一件好事).然而,当代码被组织成许多用于可重用性/可读性/可维护性的函数/方法时,并且当代码需要通过例如大数据帧来操纵大数据结构时,通过一系列转换/操作,传递值语义引导大量复制数据和堆积颠簸(一件坏事).例如,一个数据帧需要50Mb的上作为函数参数将至少要复制的相同的次数作为在调用堆栈的底部的函数调用深度和堆的大小为N传递堆*50MB.如果函数从调用链的深处返回转换/修改的数据帧,则复制由另一个N上升.
SO问题避免传递数据框的最佳方法是什么?触及这个主题,但是以避免直接询问传递参考问题的方式表达,并且获胜的答案基本上说,"是的,值传递是R如何工作".这实际上不是100%准确.R环境支持传递引用语义,而诸如proto之类的 OO框架广泛使用此功能.例如,当一个proto对象作为函数参数传递,而它的"魔术包装"通过值传递给R开发人员时,语义是传递引用.
似乎通过引用传递大数据框架将是一个常见问题,我想知道其他人是如何接近它的,以及是否有任何库可以实现这一点.在我的搜索中,我没有发现一个.
如果没有可用的东西,我的方法是创建一个包装数据框的proto对象.我希望有关应该添加到此对象的语法糖的指针,以使其有用,例如,重载$和[[运算符,以及我应该注意的任何陷阱.我不是R专家.
与类型无关的传递参考解决方案的加分点与R很好地集成,尽管我的需求仅限于数据帧.
例如:
A <- 1:10
B <- A
Run Code Online (Sandbox Code Playgroud)
A和B都引用相同的底层向量.
在我用C语言实现某些功能之前... R中是否有一个函数可以测试两个变量是否引用相同的底层对象?
谢谢.
我想知道找到xts对象中与一个特定行相同的所有行的最快方法是什么
library(xts)
nRows <- 3
coreData <- data.frame(a=rnorm(nRows), b=rnorm(nRows), c=rnorm(nRows))
testXts1 <- xts(coreData, order.by=as.Date(1:nRows))
testXts2 <- xts(coreData, order.by=as.Date((nRows + 1):(2*nRows)))
testXts3 <- xts(coreData, order.by=as.Date((2*nRows + 1):(3*nRows)))
testXts <- rbind(testXts1, testXts2, testXts3)
> testXts
a b c
1970-01-02 -0.3288756 1.441799 1.321608
1970-01-03 -0.7105016 1.639239 -2.056861
1970-01-04 0.1138675 -1.782825 -1.081799
1970-01-05 -0.3288756 1.441799 1.321608
1970-01-06 -0.7105016 1.639239 -2.056861
1970-01-07 0.1138675 -1.782825 -1.081799
1970-01-08 -0.3288756 1.441799 1.321608
1970-01-09 -0.7105016 1.639239 -2.056861
1970-01-10 0.1138675 -1.782825 -1.081799
rowToSearch <- first(testXts)
> rowToSearch
a …Run Code Online (Sandbox Code Playgroud) 我完全糊涂了.我有一个功能,正在创建一个表去分位数.我的问题是,如果在提供给函数的数据中有一个名为"species"的列,那么我想按此列进行分组.否则,请取消相同的代码.我得到了警告,这是不赞成的,但即使如此,奇怪的是我所有的变量都在变化.
我很确定这是一个新的行为,并且之前没有发生过,因为我使用这个功能2年左右没有改变它.
有人可以看看吗?
library(dplyr)
set.seed(1)
df<- data.frame(Intensity=rnorm(1000, 25, 3))
class(df)
#> [1] "data.frame"
df_backup <- df
class(df_backup)
#> [1] "data.frame"
my_plotAbundanceRank <- function(data_set) {
quantile_df <-
data_set %>%
dplyr::group_by_at(vars(matches('^species$'))) %>%
dplyr::summarise(`5%`=stats::quantile(log10(Intensity),.05),
`50%`=stats::quantile(log10(Intensity),.50),
`95%`=stats::quantile(log10(Intensity),.95))
}
print(my_plotAbundanceRank(df))
#> # A tibble: 1 x 3
#> `5%` `50%` `95%`
#> <dbl> <dbl> <dbl>
#> 1 1.30 1.40 1.48
class(df)
#> [1] "tbl_df" "tbl" "data.frame"
class(df_backup)
#> [1] "tbl_df" "tbl" "data.frame"
Run Code Online (Sandbox Code Playgroud)
执行后,类正在从[1] "data.frame"更改[1] "tbl_df" "tbl" "data.frame"为所有变量,即使它们未提供给函数.
我正在使用dplyr_0.8.0.1 …
我注意到在使用不同的赋值运算符时data.table中存在一些不一致(与我不一致)的行为.我不得不承认我从来没有完全区分"="和copy(),所以也许我们可以在这里阐明一些.如果使用"="或"< - "而不是下面的copy(),则在更改复制的data.table时,原始data.table也将更改.
请执行以下命令,您将看到我的意思
library(data.table)
example(data.table)
DT
x y v
1: a 1 42
2: a 3 42
3: a 6 42
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9
DT2 = DT
Run Code Online (Sandbox Code Playgroud)
现在我将更改DT2的v列:
DT2[ ,v:=3L]
x y v
1: a 1 3
2: a 3 3
3: a 6 3
4: b 1 3
5: b 3 3
6: b 6 3
7: …Run Code Online (Sandbox Code Playgroud) 为了清除自己的一些内容,我想更好地了解复制何时以及何时复制data.table.正如这个问题所指出的那样,确切地了解data.table是否是对另一个data.table的引用(vs副本),如果只是运行以下内容,那么最终修改原始数据:
library(data.table)
DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
newDT <- DT # reference, not copy
newDT[1, a := 100] # modify new DT
print(DT) # DT is modified too.
# a b
# [1,] 100 11
# [2,] 2 12
Run Code Online (Sandbox Code Playgroud)
但是,如果这样做(例如),那么您最终修改新版本:
DT = data.table(a=1:10)
DT
a
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
10: 10 …Run Code Online (Sandbox Code Playgroud) 当我复制data.table并修改新的一个时,原始的一个会被改变,我找不到一个.这是正常行为吗?
dt = data.table(zone=1:5, pc=11:15)
dtt = dt
dtt[, pc := pc*2 ]
dtt
zone pc
1: 1 22
2: 2 24
3: 3 26
4: 4 28
5: 5 30
dt
zone pc
1: 1 22
2: 2 24
3: 3 26
4: 4 28
5: 5 30
Run Code Online (Sandbox Code Playgroud)
创建新的data.table时我没有问题更明确: dtt = data.table(dt)