关于data.table的这个问题有两部分......:
首先,data.table中消失的row.names。 请参阅下面的代码:将数据帧转换为data.table zaps the row.names。 但即使将row.names添加为字段,它们也会在转换过程中被删除。 我究竟做错了什么?
第二,沟通data.tables。 请参阅下面的代码:如果我创建一个新的data.table,旧的和新的似乎正在进行通信。 换句话说,它们是不同的表,但更新表1也更新表2。 我做错了什么?
library(data.table)
library(stringr)
# part 1 - the zapped row.names...
data(mtcars)
dt=mtcars
dt$cars=row.names(dt) # add row.names as field
cars=dt$cars # stores field as vector, as next step will zap it
dt=data.table(mtcars) # zaps field "cars"...
dt=cbind(dt,cars)
# part 2 - the communicating data.tables...
dt1=dt # make a new table
dt1[,cars:=str_replace(cars,"Valiant","Thingy")] # change something in the table
# now *both* tables have changed...
# try with data.frame
df=mtcars
df$cars=row.names(df)
df1=df
df1=transform(df1,cars=str_replace(cars,"Valiant","Thingy")) # works as expected
# now only df1 has changed.
答案 0 :(得分:4)
您的代码中存在错误。
您根据自己的说明使用dt=data.table(mtcars)
你打算用:dt=data.table(dt)
或dt=data.table(mtcars, cars)
换句话说,正如@Arun在评论中指出的那样,您将mtcars
转换为名为data.table
的新 dt
,然后修改{{1} }}。您从未对dt
进行任何修改。
你只拍了一张浅色的副本。看看mtcars
以及马特指出的另一个问题
?copy