web-dev-qa-db-fra.com

R - Comment créer un sous-ensemble de colonnes en fonction des valeurs d'une ligne dans un bloc de données

J'ai une matrice que j'aimerais sous-ensemble et éventuellement utiliser pour faire un tracé. Les données sont une liste de dénombrements pour des marqueurs sanguins spécifiques pour chaque patient d'une population. Cela ressemble à ceci:

    df <- data.frame(MarkerID=c("Class","A123","A124"),
             MarkerName=c("","X","Y"),
             Patient.1=c(0,1,5),
             Patent.2=c(1,2,6),
             Patent.3=c(0,3,7),
             Patient.4=c(1,4,8))

Je voudrais faire un bloc de données de tous les patients (colonnes 3-6) qui ont une valeur de classe de zéro (1ère ligne) et un deuxième bloc de données de tous les patients avec une valeur de classe de 1.

Dans le passé, j'ai utilisé la fonction de sous-ensemble pour sélectionner des lignes en fonction des valeurs d'une colonne, est-il possible de sélectionner un sous-ensemble de colonnes en fonction des valeurs d'une ligne?

J'ai essayé ça:

x <- subset(data, data[1,] == 0)

cependant, quand je fais dim(x) le nombre de colonnes est le même que dim(data) mais le nombre de lignes est différent. Des idées sur la façon dont je peux faire ce retour uniquement les colonnes dont la valeur dans la ligne 1 est 0?

Roland, oui. Vous êtes un exemple df est à quoi ressemble la trame de données. Il y a environ 30 000 marqueurs et> 400 patients dans le bloc de données, donc je n'ai pas publié la dput(head(data)). Merci pour le conseil de remodelage, je vais essayer.

Votre exemple de code a fonctionné pour sous-définir les colonnes en fonction des lignes

data[,c(TRUE,TRUE,data[1,-(1:2)]==1)]

sur les données, j'ai ensuite pu obtenir un bloc de données avec toutes les lignes et uniquement les colonnes avec la classe indiquée.

12
jeran stratford

Vos données ne sont ni arrangées dans le bon sens. Il vaudrait mieux le remodeler.

En l'absence de données d'entrée, ce n'est qu'une supposition:

df <- data.frame(MarkerID=c("Class","A123","A124"),
                 MarkerName=c("","X","Y"),
                 Patient.1=c(0,1,5),
                 Patent.2=c(1,2,6),
                 Patent.3=c(0,3,7),
                 Patient.4=c(1,4,8))

#  MarkerID MarkerName Patient.1 Patent.2 Patent.3 Patient.4
#1    Class                    0        1        0         1
#2     A123          X         1        2        3         4
#3     A124          Y         5        6        7         8

df[,c(TRUE,TRUE,df[1,-(1:2)]==0)]

#  MarkerID MarkerName Patient.1 Patent.3
#1    Class                    0        0
#2     A123          X         1        3
#3     A124          Y         5        7

Ici, c(TRUE,TRUE,df[1,-(1:2)]==0) crée un vecteur logique, qui est TRUE pour les deux premières colonnes et pour ces colonnes, qui ont un 0 dans la première ligne. Ensuite, je sous-ensemble les colonnes basées sur ce vecteur.

df[,c(TRUE,TRUE,df[1,-(1:2)]==1)]

#  MarkerID MarkerName Patent.2 Patient.4
#1    Class                   1         1
#2     A123          X        2         4
#3     A124          Y        6         8

Cela remodelerait vos données dans un format plus courant (pour les logiciels statistiques):

library(reshape2)  
df2 <- merge(melt(df[1,],variable.name="Patient",value.name="class")[-(1:2)],
             melt(df[-1,],variable.name="Patient"),all=TRUE)

#    Patient class MarkerID MarkerName value
#1  Patent.2     1     A123          X     2
#2  Patent.2     1     A124          Y     6
#3  Patent.3     0     A123          X     3
#4  Patent.3     0     A124          Y     7
#5 Patient.1     0     A123          X     1
#6 Patient.1     0     A124          Y     5
#7 Patient.4     1     A123          X     4
#8 Patient.4     1     A124          Y     8

Vous pouvez alors utiliser subset:

subset(df2,class==0)

#    Patient class MarkerID MarkerName value
#3  Patent.3     0     A123          X     3
#4  Patent.3     0     A124          Y     7
#5 Patient.1     0     A123          X     1
#6 Patient.1     0     A124          Y     5
12
Roland