2017-09-13 4 views
0

J'ai un ensemble de données avec plusieurs colonnes. En utilisant R je veux garder seulement les colonnes qui ont le premier caractère comme T pour créer un sous-ensemble comme indiqué dans les données de sortie ci-dessous.Données de découpage basées sur le premier caractère du nom de colonne

Entrée de données

T1234 T5678 T9101112 A B D E 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 
    1  2  3 4 5 6 7 

Sortie de données

T1234 T5678 T9101112 
    1  2  3 
    1  2  3 
    1  2  3 
    1  2  3 
    1  2  3 
    1  2  3 
    1  2  3 

Toute suggestion comment cela peut se faire? Merci.

Répondre

2

dans la base en utilisant R RegEx

df <- data.frame(T1234=rep(1,7),T5678=2,T9101112=3,A=4,B=5,D=6,E=7) 

df[,grepl("^T",names(df))] 

Le motif de regex ^T matchs T au début de chaque nom de ligne. Vous pourriez affiner le motif à ^T\\d+ si vous vouliez faire correspondre simplement "T" suivi de 1 ou plusieurs chiffres, comme autre exemple.

Notez également que ^ affirme que vous êtes au début de la chaîne. Sans elle, vous auriez correspondez « AT912340 », car il contient un T.

Pour plusieurs caractères (c.-à-colonnes commençant par T ou M) nous utiliserions l'opérateur « ou » |

df[,grepl("^T|M",names(df))] 

Et faire correspondre des groupes de personnages comme RDY ou MTP nous ferions comme ceci:

df[,grepl("^T|MTP|Check|RDY",names(df))] 

note: dans les commentaires que je crochets utilisé par erreur comme ceci: [T, M]. L'utilisation de parenthèses indique à RegEx de faire correspondre l'un des caractères entre crochets. Dans ce cas, il correspondra à "T", "M" ou ",". Évidemment, nous ne voulons pas faire correspondre une virgule ici, et il est syntaxiquement incorrect d'avoir les virgules entre parenthèses séparant chaque caractère. Pour correspondre à "T" ou "M" la syntaxe correcte avec des parenthèses serait [TM], cependant, pour correspondre à des mots, ou des chaînes courtes comme ci-dessus, nous devons utiliser|comme l'opérateur "ou".

+0

@ Mako212 - Merci, cela fonctionne. Puis-je étendre cela pour ajouter plusieurs modèles. Par exemple: Je veux garder la colonne avec 'T *' et aussi avec 'M *'. Je peux écrire plusieurs 'df [, grepl ("^T. * ", Noms (df))]' et 'df [, grepl ("^M. * ", Noms (df))]' puis 'cbind () 'eux pour obtenir un' data' –

+0

@ChetanArvindPatil pas besoin d'écrire plusieurs instructions à moins que le RegEx commence à devenir trop salissant pour garder une trace de. – Mako212

+0

@ Mako212 - L'ensemble de données que j'ai doit être rogné basé sur ces '"^[T, MTP, Check, RDY] "', mais ce que je vois est que les colonnes avec le premier caractère comme 'P' et' M' sont également taillés avec elle.'grepl' devrait correspondre à' MTP' avec les trois premiers caractères pour le nom de la colonne, puis décider si couper ou non? De même pour 'Check' et' RDY'? –

1
> require(dplyr) 
> df <- data.frame(T1234=rep(1,7),T5678=2,T9101112=3,A=4,B=5,D=6,E=7) 
> df 
    T1234 T5678 T9101112 A B D E 
1  1  2  3 4 5 6 7 
2  1  2  3 4 5 6 7 
3  1  2  3 4 5 6 7 
4  1  2  3 4 5 6 7 
5  1  2  3 4 5 6 7 
6  1  2  3 4 5 6 7 
7  1  2  3 4 5 6 7 
> select(df,starts_with('T')) 
    T1234 T5678 T9101112 
1  1  2  3 
2  1  2  3 
3  1  2  3 
4  1  2  3 
5  1  2  3 
6  1  2  3 
7  1  2  3 
> 

Ou, sans dplyr

> df[,grepl('T',colnames(df))] 
    T1234 T5678 T9101112 
1  1  2  3 
2  1  2  3 
3  1  2  3 
4  1  2  3 
5  1  2  3 
6  1  2  3 
7  1  2  3 
> 

mais ce dernier frappera T en toute position.

+0

@ mrbcuda - Merci.. Est-ce que cela peut être fait _without_ 'dplyr()'? –

0

Une autre solution sans utiliser regex:

df[,substr(names(df),1,1) %in% c("T","M")]