0
votes

Sous-ensemble dataframe lignes basées sur le vecteur de caractère lorsque "% en%" et "qui" ne fonctionne pas

Je suis bloqué dans cette tâche simple de sous-place des rangées d'un fichier de données basé sur un vecteur de caractère: xxx

où j'aimerais obtenir un fichier de données contenant uniquement les lignes définies par un Correspondance entre df $ spécimen.label et VEC . Utilisation du simple df2 <- df [df $ spécimen.Label% in% VEC,] renvoie un fichier de données de 0 lignes, tout en appelant pour les index de ligne avec Vec2 <- qui (DF $ SPÉCIMEN.LABEL% IN% VEC) Retourne un vecteur vide d'entier de classe.

Cependant, Grep renvoie les indices corrects. par exemple. Grep ("E1CD3D70.132B.452F.BA10.026721_D2", DF $ SPÉCIMEN.LABEL) Retours 10 . Je pensais donc pourquoi ne pas le reproduire comme ceci: xxx

mais malheureusement, cela renvoie un vecteur ind (de longueur égale à VEC ) Rempli avec NA S au lieu des index de la rangée souhaité, ainsi qu'un avertissement indiquant que "Nombre d'éléments à remplacer n'est pas un multiple de longueur de remplacement". Qu'est-ce qui ne va pas ici? Pourquoi Grep fonctionne-t-il lorsqu'il est appelé individuellement mais ne renvoie pas à des valeurs lorsqu'il est utilisé à l'intérieur d'une boucle? Merci d'avance pour les solutions fructueuses.


2 commentaires

grep suppose . pour être quelque chose que correspondant distinguer entre _ et . .


Le problème est que dans VEC vous avez des points, alors que dans df $ spécimen.label Vous avez des traits d'union, de sorte que vos premières commandes ne renvoient rien. df [df $ spécimen.label% in% gsub ("\\.", "-", VEC),] retourne quelques lignes de l'original Dataframe (avec vos données d'échantillons, il renvoie des lignes 3, 6, 8, 10). Est-ce votre sortie souhaitée?


3 Réponses :


1
votes

On dirait que votre problème est que VEC code> contient des points au lieu de tirets. Ce code peut s'attaquer à ce que:

#Replace
vec <- gsub('.','-',vec,fixed = T)
#Compare
df2 <- df[df$Specimen.Label %in% vec,]

    PCC Participant.ID                    Specimen.Label
3  PNNL        01CO008    8cc7e656-0152-4359-8566-0581c3
6  PNNL        05CO002 f635496c-0046-4ecd-89bc-7a4f33_D2
8  PNNL        11CO051 b3696374-c6c0-49dd-833e-596e26_D2
10 PNNL        11CO053 e1cd3d70-132b-452f-ba10-026721_D2


0 commentaires

1
votes

Le match de chaîne échoue car les données dans VEC sont délimitées par des périodes, mais les données dans df sont délimitées par des tirets.

BASE R SOLUTION

si vous remplacez le . avec - , vous pouvez utiliser le formulaire [ de l'opérateur d'extrait avec % dans % : xxx

... et la sortie: xxx

solution dplyr < p> Une solution avec dplyr :: filtre () est la suivante: xxx


0 commentaires

1
votes

(il suffit d'ajouter mon commentaire comme une réponse puisqu'il a été affiché avant les autres) em>

Le problème est que dans VEC code> Vous avez des points, tandis que dans df $ speximen.label code> Vous avez des traits d'union, de sorte que vos premières commandes ne renvoient rien. Si vous écrivez à la place p> xxx pré>

vous obtenez p> xxx pré>


une autre option de base r est d'utiliser la fonction Sous-ensemble CODE> P>

subset(df, Specimen.Label %in% gsub("\\.", "-", vec))


0 commentaires