【发布时间】:2020-12-06 03:15:54
【问题描述】:
这一直困扰着我很长一段时间,我认为 data.table 包有一些我不明白的地方。如果我想要 data.table 的两个“切片”,并将其中一个重命名为新名称,如果我忘记输入“copy”,那么 data.table 会将具有 新名称 的两个对象视为同样的事情。
- 是使用“复制”功能解决此问题的唯一系统方法吗?即,如果我不使用“复制”,我会总是得到这种将相同对象视为相同事物的行为吗?
- 此功能的用途是什么?与内存存储有关..?如果我决定更改一个 DT 然后使用原始对象,这似乎会导致一些严重的无意错误。此外,如果一个新的 data.table 用户来自 base R,并且不知道这种行为,那么他们的所有代码都会出现一些系统性问题。
- 如果 setDT 函数实际上并未将数据表“设置”为新对象,那么它的意义何在?
这是一个说明性示例:
library(data.table)
#####BOTH_SETDT & COPY#####
first_dt <- data.frame(a = c(1,2,3), b = c(9,8,7))
setDT(first_dt)
second_dt <- copy(first_dt)
setDT(second_dt)
first_dt[,a:=a/50]
second_dt[,b:=b/50]
print(first_dt)
# a b
#1: 0.02 9
#2: 0.04 8
#3: 0.06 7
print(second_dt)
# a b
#1: 1 0.18
#2: 2 0.16
#3: 3 0.14
#####BOTH SETDT#####
first_dt <- data.frame(a = c(1,2,3), b = c(9,8,7))
setDT(first_dt)
second_dt <- first_dt
setDT(second_dt)
first_dt[,a:=a/50]
second_dt[,b:=b/50]
print(first_dt)
# a b
#1: 0.02 0.18
#2: 0.04 0.16
#3: 0.06 0.14
print(second_dt)
# a b
#1: 0.02 0.18
#2: 0.04 0.16
#3: 0.06 0.14
#####SINGLE SETDT#####
first_dt <- data.frame(a = c(1,2,3), b = c(9,8,7))
setDT(first_dt)
second_dt <- first_dt
first_dt[,a:=a/50]
second_dt[,b:=b/50]
print(first_dt)
# a b
#1: 0.02 0.18
#2: 0.04 0.16
#3: 0.06 0.14
print(second_dt)
# a b
#1: 0.02 0.18
#2: 0.04 0.16
#3: 0.06 0.14
#####AS.DATA.TABLE#####
first_dt <- as.data.table(data.frame(a = c(1,2,3), b = c(9,8,7)))
second_dt <- first_dt
first_dt[,a:=a/50]
second_dt[,b:=b/50]
print(first_dt)
# a b
#1: 0.02 0.18
#2: 0.04 0.16
#3: 0.06 0.14
print(second_dt)
# a b
#1: 0.02 0.18
#2: 0.04 0.16
#3: 0.06 0.14
#####AS.DATA.TABLE WITH JUST COPY#####
first_dt <- as.data.table(data.frame(a = c(1,2,3), b = c(9,8,7)))
second_dt <- copy(first_dt)
first_dt[,a:=a/50]
second_dt[,b:=b/50]
print(first_dt)
# a b
#1: 0.02 9
#2: 0.04 8
#3: 0.06 7
print(second_dt)
# a b
#1: 1 0.18
#2: 2 0.16
#3: 3 0.14
#####ANOTHER AS.DATA.TABLE#####
first_dt <- (data.frame(a = c(1,2,3), b = c(9,8,7)))
second_dt <- as.data.table(first_dt)
first_dt <- as.data.table(first_dt)
first_dt[,a:=a/50]
second_dt[,b:=b/50]
print(first_dt)
print(second_dt)
【问题讨论】:
-
见
?setDT;该功能适用于希望在 data.frame 上使用data.table接口但内存有限的用户。它与内存和速度有关;相对于 data.frame 对象,副本将使 RAM 使用量翻倍。而且它更快,因为内存分配需要时间。听起来您想要as.data.table,因为它包含副本。这些代码在很大程度上是等效的:setDT(copy(DF)); as.data.table(DF) -
啊,我不知道!谢谢科尔!
标签: r data.table