如何在R中创建数据框的副本

时间:2016-01-24 23:57:35

标签: r dataframe

我想复制从* .csv文件中读入的数据框的全部内容。如果我copyOfFirstFrame <- firstFrame,我认为这不是重复。那么我需要做什么?

firstFrame <- read_csv("fileName.csv")
copyOfFirstFrame <- ?????

如果我执行以下操作,则内​​存地址保持不变。

copyOfFirstFrame <- firstFrame
tracemem(firstFrame) == tracemem(copyOfFirstFrame)
[1] TRUE

副本必须产生两个唯一的内存地址。查看In R, how can I check if two variable names reference the same underlying object?了解详情。

4 个答案:

答案 0 :(得分:20)

让DATA成为预先存在的数据框对象。 我正在创建一个新对象COPY,它是DATA的精确副本,但它占用不同的内存位置,因此不会指向原始数据框。

我使用函数data.frame(),如下所示:

> COPY<-data.frame(DATA)

我使用tracemem()检查内存地址是否相同:

> tracemem(COPY)==tracemem(DATA)
> [1] FALSE

我认为,这已经足够了。

答案 1 :(得分:10)

将cbind与一个data.frame一起使用将确保您拥有副本:

> df <- cbind(NA, NA)
> df2 <- cbind(df)
> df2
     [,1] [,2]
[1,]   NA   NA
> df2[,1] <- 1
> df
     [,1] [,2]
[1,]   NA   NA
> df2
     [,1] [,2]
[1,]    1   NA
> 

答案 2 :(得分:5)

或者我们可以使用data.table::copy()

df.1 <- data.frame(1)

library(data.table)
df.2 <- copy(df.1)

> tracemem(df.1) == tracemem(df.2)
[1] FALSE

答案 3 :(得分:1)

cbind()和data.frame,添加变量或变量名称都不会将原始数据帧与data.table的set()函数对数据帧副本所做的修改隔离开来。

> library(data.table)
> # changing name of variable in copy doesn't work, emp modified
> (emp <- data.frame(type=c('a','b','c'),amt=as.numeric(c(1,2,3))))
  type amt
1    a   1
2    b   2
3    c   3
> (dd <- cbind(emp,dv=''))
  type amt dv
1    a   1   
2    b   2   
3    c   3   
> names(dd)[names(dd)=='type'] <- 'tp'
> i <- which(dd$tp=='a'); set(dd,i,'tp','alpha')
> i <- which(dd$tp=='b'); set(dd,i,'tp','beta')
> i <- which(dd$tp=='c'); set(dd,i,'tp','chi')
> dd
     tp amt dv
1 alpha   1   
2  beta   2   
3   chi   3   
> emp
   type amt
1 alpha   1
2  beta   2
3   chi   3
> dd$dv <- factor(dd$dv)
> table(dd$dv)
> table(emp$type)

    a     b     c alpha  beta   chi 
    0     0     0     1     1     1 
> tracemem(dd)==tracemem(emp)
[1] FALSE
> 
> # same w/ data.frame doesn't work, emp still modified
> (emp <- data.frame(type=c('a','b','c'),amt=as.numeric(c(1,2,3))))
  type amt
1    a   1
2    b   2
3    c   3
> (dd <- data.frame(emp,dv=1))
  type amt dv
1    a   1  1
2    b   2  1
3    c   3  1
> names(dd)[names(dd)=='type'] <- 'tp'
> i <- which(dd$tp=='a'); set(dd,i,'tp','alpha')
> i <- which(dd$tp=='b'); set(dd,i,'tp','beta')
> i <- which(dd$tp=='c'); set(dd,i,'tp','chi')
> dd$tp <- factor(dd$tp)
> table(dd$tp)

alpha  beta   chi 
    1     1     1 
> table(emp$type)

    a     b     c alpha  beta   chi 
    0     0     0     1     1     1 
> tracemem(dd)==tracemem(emp)
[1] FALSE
> 
> # only modifying new variable insulates emp
> (emp <- data.frame(type=c('a','b','c'),amt=as.numeric(c(1,2,3))))
  type amt
1    a   1
2    b   2
3    c   3
> (dd <- cbind(emp,dv=''))
  type amt dv
1    a   1   
2    b   2   
3    c   3   
> names(dd)[names(dd)=='type'] <- 'tp'
> i <- which(dd$tp=='a'); set(dd,i,'dv','alpha')
> i <- which(dd$tp=='b'); set(dd,i,'dv','beta')
> i <- which(dd$tp=='c'); set(dd,i,'dv','chi')
> dd
  tp amt    dv
1  a   1 alpha
2  b   2  beta
3  c   3   chi
> emp
  type amt
1    a   1
2    b   2
3    c   3
> table(emp$type)

a b c 
1 1 1 
> tracemem(dd)==tracemem(emp)
[1] FALSE
>