Est-il un meilleur (à savoir vectorisé) moyen de mettre la partie d'un nom de colonne dans une rangée d'une trame de données dans R

StackOverflow https://stackoverflow.com/questions/2584806

  •  24-09-2019
  •  | 
  •  

Question

I ai une trame de données en R qui est apparu à partir de l'exécution de certaines stats sur le résultat d'une opération à l'état fondu / fonte. Je veux ajouter une ligne dans cette trame de données contenant une valeur nominale. Cette valeur nominale est présente dans les noms de chaque colonne

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

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

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)

En général, j'aurais 16-24 colonnes. Toutes les idées?

Était-ce utile?

La solution

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)

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)))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top