2017-06-30 3 views
1

J'ai une trame de données comme suit:Erreur dans le retrait d'une partie d'une chaîne

df: 

S   S1  S2  S3  S4 
100130426  0  0 0.9066  0 
100133144 16.3644 9.2659 11.6228 12.0894 
100134869 12.9316 17.379 9.2294 11.0799 
    3457 1910.3 2453.50 2695.37 1372.3624 
    9834 1660.13 857.30 1240.53 1434.6463 
ATP5L2|267 0  0  0.9066 0 
ATP5L|1063 1510.29 1270.79 2965.54 2397.1866 
ATP5O|539 2176.17 1868.95 2004.53 2360.3641 

Je veux vraiment supprimer « | » et aussi les chiffres après "|" dans la première colonne. Par exemple: ATP5L2 | 267 devrait être comme ATP5L2.

J'ai donc essayé de la manière suivante:

SD <- sapply(strsplit(df$s, split='|', fixed=TRUE), function(x) (x[1])) 

Mais cela m'a donné une erreur:

Error in strsplit(s, split = "|", fixed = TRUE) : non-character argument. 

sortie devrait ressembler à ce qui suit:

df: 

S   S1  S2  S3  S4 
100130426  0  0 0.9066  0 
100133144 16.3644 9.2659 11.6228 12.0894 
100134869 12.9316 17.379 9.2294 11.0799 
    3457 1910.3 2453.50 2695.37 1372.3624 
    9834 1660.13 857.30 1240.53 1434.6463 
    ATP5L2  0  0  0.9066 0 
    ATP5L 1510.29 1270.79 2965.54 2397.1866 
    ATP5O 2176.17 1868.95 2004.53 2360.3641 

Répondre

1

Vous pouvez le faire avec sub et une expression régulière.

df$S = sub("\\|.*", "", as.character(df$S)) 
df 
      S  S1  S2  S3  S4 
1 100130426 0.0000 0.0000 0.9066 0.0000 
2 100133144 16.3644 9.2659 11.6228 12.0894 
3 100134869 12.9316 17.3790 9.2294 11.0799 
4  3457 1910.3000 2453.5000 2695.3700 1372.3624 
5  9834 1660.1300 857.3000 1240.5300 1434.6463 
6 ATP5L2 0.0000 0.0000 0.9066 0.0000 
7  ATP5L 1510.2900 1270.7900 2965.5400 2397.1866 
8  ATP5O 2176.1700 1868.9500 2004.5300 2360.3641 

Détails:

sub substitue le second argument pour ce qui correspond au premier argument. Dans ce cas, nous voulons | et tout après. Vous ne pouvez pas écrire simplement | parce que cela a une signification spéciale dans les expressions régulières, donc vous "évadez" avec en écrivant \\ | Il est suivi de. *. Le . signifie "n'importe quel caractère" et * signifie n'importe quel nombre de fois, donc ensemble \\ |. * signifie | suivi de n'importe quel nombre de caractères. Nous remplaçons cela par la chaîne vide "". Nous appliquons cette opération à as.character(df$S) car votre message d'erreur donne l'impression que votre variable df$S peut être un facteur plutôt qu'une chaîne.

+0

Merci. Pourriez-vous s'il vous plaît me dire ce que font les expressions? – user3351523

+0

Ajout pour répondre. – G5W

+0

Excellent. Merci beaucoup !! – user3351523

1
SD <- sapply(strsplit(as.character(df[["S"]]), split='|', fixed=TRUE), "[[", 1) 

Vous pourrait avoir un facteur non la colonne de caractères s?

+0

Salut, Cela a fonctionné mais je reçois la sortie de seulement la première colonne ... Il devrait donner la sortie comme mentionné ci-dessus. – user3351523

+0

@ user3351523 df [["S"]] <- SD –