web-dev-qa-db-fra.com

Comment créer une copie d'un bloc de données dans R

Je souhaite dupliquer l'intégralité du contenu d'un cadre de données lu à partir d'un fichier * .csv. Je ne crois pas que ce soit une duplication si je fais copyOfFirstFrame <- firstFrame. Alors, que dois-je faire?

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

Si je fais ce qui suit, l'adresse mémoire reste la même.

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

La copie doit avoir pour résultat deux adresses de mémoire uniques. Check Dans R, comment puis-je vérifier si deux noms de variable font référence au même objet sous-jacent? pour plus de détails.

17
user1605665

Soit DATA un objet de cadre de données préexistant . Je crée un nouvel objet, COPY, qui est une copie exacte de DATA, mais il occupe un emplacement mémoire différent et ne pointe donc pas vers le cadre de données d'origine.

J'utilise la fonction data.frame () comme ceci:

> COPY<-data.frame(DATA)

Je vérifie si les adresses mémoire sont identiques ou non avec tracemem ():

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

Assez louable, je pense.

16
Dex

Utiliser cbind avec un seul data.frame vous assurera d’avoir une copie

> 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
> 
10
hd1

Alternativement, nous pouvons utiliser data.table::copy().

df.1 <- data.frame(1)

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

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

Ni cbind () ni data.frame, avec les variables ajoutées ou les noms de variables modifiés, n'isolent le cadre de données d'origine des modifications apportées par la fonction set () de data.table à la copie du cadre de données.

> 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
> 
1
user74279