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