2010-04-06 3 views
3

J'ai une trame de données dans R qui provient de l'exécution de statistiques sur le résultat d'une fusion/opération de moulage. Je veux ajouter une ligne dans cette base de données contenant une valeur nominale. Cette valeur nominale est présente dans les noms de chaque colonneExiste-t-il une meilleure façon de vectoriser une partie d'un nom de colonne dans une ligne d'une trame de données? R

df<-as.data.frame(cbind(x=c(1,2,3,4,5),`Var A_100`=c(5,4,3,2,1),`Var B_5`=c(9,8,7,6,5))) 
> df 
    x Var A_100 Var B_5 
1 1   5  9 
2 2   4  8 
3 3   3  7 
4 4   2  6 
5 5   1  5 

Donc, je veux créer une nouvelle ligne, qui contient « 100 » dans la colonne Var A_100 et « 5 » dans le Var B_5. Actuellement, c'est ce que je fais, mais je suis sûr qu'il doit y avoir une meilleure façon vectorisée de le faire.

temp_nom<-NULL 
for (l in 1:length(names(df))){ 
temp_nom[l]<-strsplit(names(df),"_")[[l]][2] 
} 
temp_nom 
[1] NA "100" "5" 
df[6,]<-temp_nom 
> df 
    x Var A_100 Var B_5 
1 1   5  9 
2 2   4  8 
3 3   3  7 
4 4   2  6 
5 5   1  5 
6 <NA>  100  5 
rm(temp_nom) 

Typiquement, j'aurais 16-24 colonnes. Des idées?

Répondre

1

Vous pouvez créer temp_nom de deux façons (au moins):

# strsplit create list so you can sapply on it 
sapply(strsplit(names(df),"_"), "[", 2) 

# using regular expressions: 
sub(".+_|[^_]+", "", names(df)) 

Et pour assigment vous pouvez convertir temp_nom à numérique (dans d'autres cas, il mess avec les types de colonnes)

df[nrow(df)+1,] <- as.numeric(temp_nom) 

de Bien sûr, vous pouvez le faire en une ligne:

df[nrow(df)+1,] <- as.numeric(sapply(strsplit(names(df),"_"), "[", 2)) 
# or 
df[nrow(df)+1,] <- as.numeric(sub(".+_|[^_]+", "", names(df))) 
Questions connexes