3 votes

Deux questions sur le formatage des données pour R

J'ai deux questions, toutes deux assez simples je crois, qui concernent R.

Je voudrais créer une instruction IF qui attribue une valeur NA à certaines lignes d'une colonne. J'ai essayé la commande suivante :

a[a[,21]==0,5:10] <-NA

l'erreur dit :

Erreur dans [<-.data.frame( tmp , a[, 21] == 0, 5:20, value = NA) : les valeurs manquantes ne sont pas autorisées dans les affectations en indice des cadres de données.

Essentiellement, ce code est censé prendre n'importe quelle valeur 0 dans la colonne 21, et remplacer les valeurs de cette ligne des colonnes 5 à 10 par NA. Il y a déjà des NA dans la colonne 21, mais je ne suis pas sûr que cela serve à quelque chose ?

Je ne suis pas du tout sûr de la façon de réaliser cette prochaine fonction. J'ai besoin de manipuler des données qui contiennent des contrôles positifs et négatifs. Cependant, lorsque je manipule les données, je ne veux pas que les valeurs de contrôle positives et négatives fassent partie de la manipulation, mais je veux que les contrôles positifs et négatifs restent dans les colonnes parce que je dois les utiliser plus tard. Existe-t-il un moyen d'ignorer temporairement ces valeurs afin qu'elles ne soient pas incluses dans la manipulation ?

Voici un exemple de données :

L = c(2,1,4,3,1,4,2,4,5,1) 
R = c(2,4,5,1,"Neg",2,"",1,2,1) 
T = c(2,1,4,2,"CTRL",2,"PCTRL",2,1,4) 
test <- data.frame(L=L,R=R,T=T)

J'aimerais pouvoir ignorer temporairement ces lignes en fonction des caractères "Neg" "CTRL"/"" "PCTRL" plutôt que sur leur position dans le cadre de données, si possible. Remarquez que pour le contrôle négatif, Neg et CTRL sont dans des colonnes séparées, mais sur la même ligne, tout comme le contrôle positif où il y a un blanc et PCTRL dans des colonnes séparées mais sur les mêmes lignes. Y a-t-il un moyen d'y parvenir compte tenu de ces conditions bizarres ?

J'espère que tout ceci a été écrit assez clairement, et je remercie d'avance tous ceux qui ont pris le temps de m'aider !

5voto

Essayez ceci pour sous-dimensionner votre cadre de données aux lignes où R n'est pas "Neg" :

subset(test, R!="Neg")

Pour le problème des NA, vous avez probablement déjà des NA dans votre cadre de données, non ? Essayez si cela fonctionne :

a[a[,21] %in% 0, 5:10] <- NA

4voto

BondedDust Points 105234

Essayez plutôt :

a[ which(a[,21]==0), 5:10] <-NA

Explication : le == renvoie des valeurs NA et l'opération [<- ne les accepte pas. Le site which retournera un tableau numérique et "jettera les NA". Pour l'anecdote, la fonction [ (sans le '<-') retournera toutes les lignes NA. Ceci est considéré comme une "fonctionnalité", mais je trouve que c'est un "désagrément". which pour la sélection ainsi que pour l'affectation sélective.

3voto

crippledlambda Points 8422

Pour le premier problème : si a[,21] est négatif, voulez-vous attribuer NA ? Dans ce cas,

a[replace(a[,21],is.na(a[,21]),0)==0,5:10] <- NA

Sinon (notez que j'ai remplacé la valeur de remplacement de "0" par quelque chose de non nul ("1" utilisé ici mais cela n'a pas vraiment d'importance tant que ce n'est pas zéro),

a[replace(a[,21],is.na(a[,21]),1)==0,5:10] <- NA

Quant au deuxième problème,

subset(test,! (L %in% c("Neg","") | T %in% c("CTRL","PCTRL")))

Dans le cas où les conditions de filtrage dans L y T ne coïncident pas toujours. S'ils coïncident toujours, alors vous pouvez simplement appliquer le test à l'un des éléments suivants L o T . Par ailleurs, vous pouvez également garder à l'esprit que T signifiait TRUE dans S, S-PLUS et R (c'est toujours le cas) ; vous pouvez réaffecter une autre valeur à T et les choses iront bien mais je crois que c'est généralement déconseillé (même chose pour le c à laquelle les gens aiment aussi s'assigner).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X