我有一个简单的问题,我想用data.table来解决.我对以下行为感到惊讶,因为我认为,在R中的分配总是复制:

library(data.table)
df <- data.frame(
  t = 1:10,
  x = "x",
  y = "y"
)
df$z <- df$y # I was assuming this is a full blown copy (since done in base R)
setDT(df)
df[t>=5, `:=`(z=x)]
df

最后,我希望在第z列中,有x的副本,在t>=5的情况下,还有y的副本,否则.然而,y也发生了变化,这让我感到惊讶.这样做的原因是什么?

     t x y z
 1:  1 x y y
 2:  2 x y y
 3:  3 x y y
 4:  4 x y y
 5:  5 x x x
 6:  6 x x x
 7:  7 x x x
 8:  8 x x x
 9:  9 x x x
10: 10 x x x

推荐答案

Data.table有自己的处理方法;您发现了一个这样的示例,它试图节省内存,因为在setdf发生时,列指向单个源. 为了解决这个问题,您可以 Select 在data.table部分中创建z;

以下是链接的一个示例

library(data.table)
df <- data.frame(
  t = 1:10,
  x = "x",
  y = "y"
)

setDT(df)[, z := copy(y)][t>=5, z := x]
df

R相关问答推荐

创建重复删除的唯一数据集组合列表

R Markdown中的交叉引用表

如何在R中添加截止点到ROC曲线图?

当两个图层映射到相同的美学时,隐藏一个图层的图例值

在另一个函数中调用ggplot2美学

par函数中的缩写,比如mgp,mar,mai是如何被破译的?

对于变量的每个值,仅 Select 包含列表中所有值的值.R

如何从R ggplot图片中获取SVG字符串?

在嵌套列表中查找元素路径的最佳方法

如何创建累加到现有列累计和的新列?

当每个变量值只能 Select 一次时,如何从数据框中 Select 两个变量的组合?

使用列中的值来调用函数调用中应使用的其他列

Rmarkdown::Render vs Source()

网络抓取新闻标题和时间

如何移动点以使它们的打印不重叠

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

子样本间系数检验的比较

将日期列从字符转换为日期得到的结果是NAS

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值

如何在R曲线图弹出窗口中更改r和theta标签