row.names和更新的data.table行为

时间:2014-01-23 11:08:03

标签: r data.table

关于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. 

1 个答案:

答案 0 :(得分:4)

第1部分

您的代码中存在错误。

您根据自己的说明使用dt=data.table(mtcars) 你打算用:dt=data.table(dt)   或dt=data.table(mtcars, cars)

换句话说,正如@Arun在评论中指出的那样,您将mtcars转换为名为data.table dt,然后修改{{1} }}。您从未对dt进行任何修改。

第2部分

你只拍了一张浅色的副本。看看mtcars以及马特指出的另一个问题 ?copy