Je souhaite créer une nouvelle colonne calculée (le résumé du texte d'une autre colonne). Pour vous reproduisez créer un df comme exemple reproductible:La nouvelle colonne de données comme fonction (résumé) d'une autre ne fonctionne pas pour moi
df <- data.frame(name = replicate(1000, paste(sample(LETTERS, 20, replace=TRUE), collapse="")),stringsAsFactors=FALSE)
> head(df,3)
name
1 ZKBOZVFKNJBRSDWTUEYR
2 RQPHUECABPQZLKZPTFLG
3 FTBVBEQTRLLUGUVHDKAY
Maintenant, je veux une 2ème colonne avec le condensé du « nom » col pour chaque ligne Cela fonctionne très bien, mais il est lent (chaque md5 est différent et il est le condensé de la colonne de nom correspondant):
> df$md5 <- sapply(df$name, digest)
> head(df, 3)
name md5
1 ZKBOZVFKNJBRSDWTUEYR b8d93a9fe6cefb7a856e79f54bac01f2
2 RQPHUECABPQZLKZPTFLG 52f6acbd939df27e92232904ce094053
3 FTBVBEQTRLLUGUVHDKAY a401a8bc18f0cb367435b77afd353078
Mais (en utilisant dplyr) ne voit fonctionne pas et je ne sais pas pourquoi: le md5 est la même pour chaque ligne! En fait, c'est le résumé du nom complet de df $, y compris toutes les lignes. S'il vous plaît, quelqu'un peut-il m'expliquer?
> df <- mutate(df, md5=digest(name))
> head(df, 3)
name md5
1 ZKBOZVFKNJBRSDWTUEYR 10aa31791d0b9288e819763d9a41efd8
2 RQPHUECABPQZLKZPTFLG 10aa31791d0b9288e819763d9a41efd8
3 FTBVBEQTRLLUGUVHDKAY 10aa31791d0b9288e819763d9a41efd8
Encore une fois si je le chemin de la table de données, il semble que cela ne fonctionne pas en utilisant la méthode standard pour de nouvelles variables:
> dt <- data.table(df)
> dt[, md5:=digest(name)]
> head(dt,3)
name md5
1: ZKBOZVFKNJBRSDWTUEYR 10aa31791d0b9288e819763d9a41efd8
2: RQPHUECABPQZLKZPTFLG 10aa31791d0b9288e819763d9a41efd8
3: FTBVBEQTRLLUGUVHDKAY 10aa31791d0b9288e819763d9a41efd8
Si je force à un groupe alors il fonctionne à nouveau (mais lent) :
> dt[,md5:=digest(name), by=name]
> head(dt, 3)
name md5
1: ZKBOZVFKNJBRSDWTUEYR b8d93a9fe6cefb7a856e79f54bac01f2
2: RQPHUECABPQZLKZPTFLG 52f6acbd939df27e92232904ce094053
3: FTBVBEQTRLLUGUVHDKAY a401a8bc18f0cb367435b77afd353078
J'ai également testé tapply et de travaux (création d'un facteur, mais mes données réelles que des millions de lignes et il est très lent). Puis, d'abord, quelqu'un peut-il m'expliquer pourquoi le mpl de dplyr ne prend pas la valeur de chaque ligne pour calculer le résumé et pourquoi la même chose se produit avec la notation de table de données (à moins que je groupe)? Ensuite, y a-t-il un moyen plus rapide de calculer ce résumé pour toutes les lignes?
dplyr mute peut prendre une variable de la même taille que la trame de données, ou de longueur 1, auquel cas elle va copier cette valeur afin qu'elle corresponde au nombre de lignes dans votre trame de données.Comme vous l'avez déjà vu, 'digest (df $ name)' donne un seul md5 (vous pouvez calculer le hachage d'objets R arbitraires, et c'est ce que vous faites en ne l'appelant pas explicitement sur chaque ligne), copié dans chaque ligne de la nouvelle colonne par mutation. – dd3