7
votes

Transférer des valeurs d'un fichier de données à un autre

J'ai deux cadres de données. Le premier ressemble à ceci: xxx pré>

J'ai un deuxième Dataframe qui ressemble à ce p> xxx pré>

J'ai besoin des valeurs de transfert de df1 code> à df2 code>, mais seulement où df1 $ ID == df2 $ ID code>. Donc, le Dataframe que j'ai besoin est: P>

df2Needed <- data.frame(id=as.character(c(1:5, 21:23)),
                      v2=c(value[1:5], NA, NA, NA),
                      stringsAsFactors=F)


2 commentaires

Avez-vous vérifié ? Fusionner ?


Pourquoi faites-vous id comme personnage? Ça trier les noms par caractère, ce qui signifie 21 viendra après 2 .


4 Réponses :


5
votes

Utilisation de data.table code>: xxx pré>

ou à l'aide de la base fusionner code> comme @ Theodorelytras mentionné sous Commentaire: P>

# you don't need to have `v2` column in df2
merge(df2, df1, by="id", all.x=T, sort=F)

#   id v2     value
# 1  1 NA  1.000000
# 2  2 NA  6.210526
# 3  3 NA 11.421053
# 4  4 NA 16.631579
# 5  5 NA 21.842105
# 6 21 NA        NA
# 7 22 NA        NA
# 8 23 NA        NA


3 commentaires

Merci beaucoup pour une aide excellente, des données. La carte a fait le travail bien. On dirait que ce paquet vaut la peine d'explorer!


@Rossahmed, je pense, cette solution datable.Table Solution (comme des spectacles d'agstudy), est pas la mise en œuvre la plus efficace. Je posterai un meilleur dans un moment. S'il vous plaît vérifier. Je pense que correspondant est beaucoup plus agréable / plus simple / plus rapide pour votre problème cependant. Vous devriez envisager de regarder la réponse de Theodore.


@Arun as.data.table est plus rapide que data.table . Mais normalement, nous ne convertissons qu'une fois que même as.data.table copie tout l'objet. La classe peut être chargée par référence sans copie à l'aide de setattr si nécessaire.



4
votes

Utilisation JOIS JOIS SQL CODE> avec SQLDF CODE>

ar.dtLight <- function(){
  dt1[dt2$id, value]
}

library(microbenchmark)
microbenchmark(ag(),ar.dt(),ar.me(),tl(),ar.dtLight,times=1)

Unit: microseconds
        expr         min          lq      median          uq         max
1       ag() 7247593.591 7247593.591 7247593.591 7247593.591 7247593.591
2    ar.dt() 8543556.967 8543556.967 8543556.967 8543556.967 8543556.967
3 ar.dtLight       1.139       1.139       1.139       1.139       1.139
4    ar.me()  462235.106  462235.106  462235.106  462235.106  462235.106
5       tl()  201988.996  201988.996  201988.996  201988.996  201988.996


17 commentaires

Je ne suis pas tout à fait sûr si dt1 et dt2 devrait être inclus dans la référence.


@Arun j'ai supposé que la création de données.Table est rapide. L'OP donne une donnée de données. en tant qu'entrée, la coercition à une data.table fait partie de la solution.


Je suppose que, on devrait exécuter data.table sans créer des touches alors. Peut-être que @mattheweweowle pourrait peser? Je me souviens de lui dire que s'il y a peu de variables pour filtrer / sous-ensemble par, il ne fait pas de différence pour créer une clé et une clé par clé de clé. Donc, on pourrait plutôt utiliser % dans% sur sous-ensemble, puis extraire la valeur.


@Arun je vois. Pour créer une solution "correspondance" data.table "car % in% est correspondant .


@Astudy, à peu près. La touche de réglage de la clé par 1 colonne ne donne pas beaucoup de différence de performance. Imaginez si vous deviez toucher 3 ou 4 colonnes (sous-ensemble), puis extrayez la valeur .. Ensuite, vous verriez la différence, je crois. Je me souviens de suggérer une solution de colonne clé similaire à la réponse de Andrie et Matthew pesant pour expliquer cela (ou donc je pense :))


@Astudy La fonction data.Table () copie à un nouvel objet parmi d'autres chèques. Donc, bien sûr, il est injuste d'inclure la copie de l'objet entier à chaque fois. En cas de doute, ou en tant que bonne pratique quand même, pourquoi ne pas inclure et exclure à la fois? De plus, la valeur par défaut pour fois in microbenchmark est 100 (non montrée dans les résultats ici, mais significatif).


@Theodorelytras le plus intéressant oui, mais assez injuste.


@Arun merci pour le ping.


@Mattheweweowle, merci pour votre contribution! La partie consommatrice de temps semble être réglage clé sur dt1 . Cela peut être allégé par ne pas définir la clé et utiliser correspondant . Mais je me demandais pourquoi cela prend beaucoup de temps à Set They sur les colonnes 1E6 ...


@Mattheweowle non c'est juste. La création de partie clé qui fait partie de la solution. Mais j'accepte que lorsque les touches ont créé les données. La carte est imbattable.


@Agstudy, je suggère toujours de signaler le temps à la clé incluse et exclue. Oui, je suis d'accord qu'il est juste d'inclure la clé de jeu (qui ne copie pas). Mais je parlais de l'appel de données.Table ().


@Arun il y a 1E6 colonnes ?! J'ai manqué ça. Data.Table est conçu pour les tables maigres grandes, comme une base de données. Pas large. Pour des données très larges, une matrice est plus appropriée.


@Mattheweowle, désolé, 1e6 rangées avec 2 colonnes. La touche de réglage prend beaucoup de temps.


@Astudy, je pense que la partie "injuste" était d'ajouter la création de données.table à l'intérieur de la référence (de mon commentaire). Cependant, cela ne semble pas être la partie consommatrice de temps. Dans ce cas, une autre façon de le faire est également de définir une clé sur DT2 (à part la solution complètement différente à l'aide de correspondant ).


@MatthewDowle et Arun I Ajouter un nouveau test au banc de bancs.


@angstudy s'y rendre. Mais la différence entre les données.Table (..., Key =) et Set Tkey () n'est pas reflétée. C'est cette différence que je parle. Cela ne me dérangerait que votre texte attribue longtemps à définir la clé, ce qui n'est pas correct. Seul un appel à Set Tkey () est le moment de régler la clé et je ne peux pas voir cela chronométré.


@Astudy ar.dtlight sera toujours incroyablement plus rapide que tout le reste quand on ne l'évalue pas



5
votes

Un moyen de faire cela en utilisant fusion () : xxx

et un autre (plus élégant, je pense) en utilisant match () :: xxx


1 commentaires

(+1) pour la solution de match.



0
votes

Il suffit d'ajouter une autre approche à la liste existante d'excellentes réponses: xxx


0 commentaires