2015-07-21 1 views
0

Je travaille avec une trame de données similaire à l'extrait ci-dessous:utilisant des chaînes syntaxiquement difficiles que les noms de colonnes dans une trame de données

df <- data.frame(A=c("Some messy string to be used",222,0), 
       B=c("Very important ? indicator from 2001", 888, 44), 
       C=c("001 This variable/makes no sense", 888, 44), 
       D=c("Geography", 1, 2)) 

Je voudrais utiliser des valeurs en première ligne en tant que noms de colonnes, je m en utilisant le code ci-dessous:

names(df) <- make.names(df[1,]) 

Malheureusement, la syntaxe génère des noms dans le format Xn, comme illustré ci-dessous:

> names(df) 
[1] "X3" "X3" "X1" "X3" 

Je comprends que les chaînes utilisées sont désordonnées pour que make.names soit significativement converti. Comment puis-je forcer R à utiliser ces chaînes de manière plus efficace? En règle générale, je voudrais:

  1. Conserver les chiffres (comme ils correspondent à temps)
  2. Conserver au moins quelques premiers mots du texte
  3. Assurez-vous que les noms sont uniques
  4. L'ensemble de la solution doit être assez générique car il y a beaucoup de ordures dans la première rangée (généralement des espaces vides ou des caractères spéciaux).
+2

Vous devrez peut-être '' unlist' dire make.names (unlist (df [1,])) 'La raison pour laquelle vous avez obtenu' X1: X5' est '' df' colonnes sont factor' et vous avez l'index numérique après la coercition, qui a été converti plus tard en ajoutant 'X' avec' make.unique' – akrun

+1

@akrun, je suggère que vous le posiez comme réponse car la solution suggérée fonctionne bien. – Konrad

Répondre

3

Vous n'avez pas besoin d'utiliser make.names du tout - vous pouvez affecter les chaînes directement. Cela fonctionne parfaitement bien dans R. Vous avez juste besoin de backtick guillemet les noms lorsque vous essayez de les utiliser comme noms de R (par exemple, après que l'opérateur $):

names(df) = unlist(df[1,]) 
df$`Some messy string to be used` 
+0

@KonradRudloph merci cela fonctionne. La légère nuisance est le besoin d'ajouter le ** '' ** lors de l'utilisation du nom mais ce n'est pas une tâche majeure. – Konrad

+0

@Konrad: bien sûr, vous pouvez également sélectionner la colonne en sous-définissant le data.frame sans utiliser '$', par ex. 'df [," Une chaîne malpropre à utiliser "]' – digEmAll

1

utilisation stringsAsFactors = F dans data.frame qui va créer des colonnes comme char au lieu de facteurs. puis faites des noms dessus.

df <- data.frame(A=c("Some messy string to be used",222,0), 
      B=c("Very important ? indicator from 2001", 888, 44), 
      C=c("001 This variable/makes no sense", 888, 44), 
      D=c("Geography", 1, 2),stringsAsFactors = F) 
names(df) <- make.names(df[1,]) 
names(df)