2017-05-19 1 views
1

J'essaye de former une donnée qui est convertie d'une matrice de terme de document à une trame de données. Il y a des champs séparés pour les commentaires positifs et négatifs, donc je voulais ajouter une chaîne aux noms de colonne pour servir de "tag", pour différencier le même mot provenant des différents champs - par exemple, le mot hello peut apparaître à la fois dans les champs de commentaire positif et négatif (et donc, représenté comme une colonne dans mon dataframe), donc dans mon modèle, je veux les différencier en faisant les noms de colonne positive_hello et negative_hello.Quel est le meilleur moyen d'ajouter une chaîne spécifique à tous les noms de colonnes dans une structure de données dans R?

Je cherche un moyen de renommer les colonnes de telle manière qu'une chaîne spécifique soit ajoutée à toutes les colonnes de la base de données. Dis, pour mtcars, je veux renommer toutes les colonnes d'avoir « _sample » à la fin, de sorte que les noms de colonnes deviendraient mpg_sample, cyl_sample, disp_sample et ainsi de suite, qui étaient à l'origine mpg, cyl et disp.

J'envisage d'utiliser sapply ou lapply, mais je n'ai pas eu de progrès à ce sujet. Toute aide serait grandement appréciée.

+3

Vous devriez regarder 'sprintf' et' paste'. Pouvez-vous fournir un petit exemple reproductible? –

+0

Merci pour la suggestion, je vais éditer la question pour illustrer un exemple de ce que je veux essayer de réaliser. Je vais aussi regarder dans ceux-ci. – dizzygirl

Répondre

1

Si vous voulez préfixer chaque élément dans une colonne avec une chaîne, vous pouvez utiliser paste():

# Generate sample data 
df <- data.frame(good=letters, bad=LETTERS) 

# Use the paste() function to append the same word to each item in a column 
df$good2 <- paste('positive', df$good, sep='_') 
df$bad2 <- paste('negative', df$bad, sep='_') 

# Look at the results 
head(df) 
    good bad  good2  bad2 
1 a A positive_a negative_A 
2 b B positive_b negative_B 
3 c C positive_c negative_C 
4 d D positive_d negative_D 
5 e E positive_e negative_E 
6 f F positive_f negative_F 

Edit: On dirait que j'ai mal compris la question. Mais vous pouvez renommer des colonnes d'une manière similaire:

colnames(df) <- paste(colnames(df), 'sample', sep='_') 
colnames(df) 
[1] "good_sample" "bad_sample" "good2_sample" "bad2_sample" 

Ou renommer une colonne spécifique (première colonne, dans ce cas):

colnames(df)[1] <- paste('prefix', colnames(df)[1], sep='_') 
colnames(df) 
[1] "prefix_good_sample" "bad_sample"   "good2_sample"  "bad2_sample"  
+0

Merci pour la réponse @smacdonald. Je voulais renommer les colonnes au lieu des valeurs. Pensez-vous que l'utilisation de 'coller 'avec des indices serait un moyen efficace? – dizzygirl

1

Utilisez colnames et fonctions paste0:

df = data.frame(x = 1:2, y = 2:1) 
colnames(df) 

[1] "x" "y"

colnames(df) <- paste0('tag_', colnames(df)) 
colnames(df) 

[1] "tag_x" "tag_y"

2

Vous pouvez utiliser setnames du paquet data.table, il ne crée aucune copie de vos données.

library(data.table) 
df <- data.frame(a=c(1,2),b=c(3,4)) 
# a b 
# 1 1 3 
# 2 2 4 
setnames(df,paste0(names(df),"_tag")) 
print(df) 
# a_tag b_tag 
# 1  1  3 
# 2  2  4