2017-10-13 6 views
1

Je veux supprimer des colonnes par nom dans une matrice, j'ai remarqué que cela ne fonctionne pas les mêmes que pour la trame de données:colonnes goutte à trame de données nom vs matrice

df <- as.matrix(data.frame(x=1:5, y=2:6, z=3:7, u=4:8)) 

df[ , -which(names(df) %in% c("z","u"))] 


df <- data.frame(x=1:5, y=2:6, z=3:7, u=4:8) 

df[ , -which(names(df) %in% c("z","u"))] 

Pourquoi et comment puis-je résoudre ce problème ?

+4

Utilisez 'colnames' au lieu de' noms' lorsque vous avez une matrice – Gregor

+0

Pourquoi cette différence? – Al14

+2

Parce que les matrices et les trames de données sont différentes. Les colonnes ne sont pas aussi spéciales dans les matrices que dans les trames de données. 'colnames' fonctionnera pour les deux. – Gregor

Répondre

1

Avec une matrice, vous pouvez utiliser colnames ou rownames (ou, si vous avez besoin de généraliser jusqu'à un tableau avec plus de dimensions, la liste dimnames).

names n'est pas défini pour une matrice. Il est défini pour list, et donc pour un data.frame, où les colonnes sont généralement plus important (dans un certain sens, au moins), donc c'est une convention sûre que names fait référence aux noms de colonnes. Mais dans un tableau, il n'y a pas de raison de préférer une dimension à une autre. Une question similaire est Extract matrix column values by matrix column name.