我有一个非常大的数据帧df。 在某些时候,我想使用sqlSave()将其保存到数据库中。由于数据库表的结构大致相似但列名不完全相同,我首先要进行一些按摩。因此,我做了以下几点:
# I believe i'm copying by val
mycopy <- df
# but i also know setnames uses references... so is this the culprit?
setnames(mycopy, names(mycopy)[1], "NewColumnName")
由于我的应用程序的其他部分发出警告,我发现原来的'df'数据框在我的全局环境窗口中的RStudio中已经重命名了列名等,这让我很震惊!我如何阻止这种情况发生?为什么setnames()没有指向'mycopy'而不是原来的'df'?
更新:可重现的示例:
library(data.table) # for setnames
df <- data.frame(foo=c(1,2,3), bar=c(4,5,6))
mycopy <- df
setnames(mycopy, names(mycopy)[1], "NewColumnName")
str(df)
得出这个:
> str(df)
'data.frame': 3 obs. of 2 variables:
$ NewColumnName: num 1 2 3
$ bar : num 4 5 6
这不应该发生?
答案 0 :(得分:0)
实际上,这个非R问题: How to clone or copy a list?给了我一些如何强制按值复制的提示。
所以最后我做了:
mycopy <- data.frame(df)
它似乎有效。我不知道我之前从未注意到R正在通过ref进行复制......