J'ai deux cadres de données. Le premier ressemble à ceci: J'ai un deuxième Dataframe qui ressemble à ce p> 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)
4 Réponses :
Utilisation de ou à l'aide de la base data.table code>:
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
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 code> Solution (comme des spectacles d'agstudy), est pas i> 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 code> 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 code> est plus rapide que
data.table code>. Mais normalement, nous ne convertissons qu'une fois que même
as.data.table code> copie tout l'objet. La classe peut être chargée par référence sans copie à l'aide de
setattr code> si nécessaire.
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
Je ne suis pas tout à fait sûr si dt1 code> et
dt2 code> 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 code> 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% code> sur sous-ensemble, puis extraire la valeur.
@Arun je vois. Pour créer une solution "correspondance" data.table "car % in% code> est
correspondant code>.
@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 () code> 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 code> 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é code> sur
dt1 code>. Cela peut être allégé par ne pas définir la clé et utiliser
correspondant code>. Mais je me demandais pourquoi cela prend beaucoup de temps à
Set They Code> 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 code>).
@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 code> sera toujours incroyablement plus rapide que tout le reste quand on ne l'évalue pas
Un moyen de faire cela en utilisant et un autre (plus élégant, je pense) en utilisant fusion () code>:
match () code >:: p>
(+1) pour la solution de match.
Il suffit d'ajouter une autre approche à la liste existante d'excellentes réponses:
Avez-vous vérifié
? Fusionner code>?
Pourquoi faites-vous
id code> comme personnage? Ça trier les noms par caractère, ce qui signifie
21 code> viendra après
2 code>.