2 votes

Comment extraire l'index de colonne d'un dataframe avec le nom de la variable ?

Je voudrais extraire l'index de colonne d'une variable d'un dataframe en utilisant le nom de la variable.

voici le df par exemple:

>df 

  Mean  Var  Max
a  1     0.5  3
b  1.5   0.4  4
c  0.7   0.3  2.5
d  0.3   0.1  0.5

Je veux "inverser" ceci:

> variable.names(df[2])
[1] "Var"

avec quelque chose comme ça:

> variable.names(df$Var)
NULL

Mais obtenir "2" au lieu de "NULL"

voici mon problème entier:

my_fct  function(data, v_cont, v_cat){  
  for (i in 1:nlevels(as.factor(v_cat))){      
      sub <- subset(data , v_cat == levels(as.factor(v_cat))[i])     
      sub_stat <- c(levels(as.factor(v_cat))[i],                    
                    mean( **sub[,COLINDEX(v_cat)**] , na.rm = TRUE)     
      mat_stat <- rbind(mat_stat, sub_stat)

sub[,COLINDEX(v_cat) est ce dont j'ai besoin pour résoudre. Comment sélectionner la variable initiale dans ma nouvelle matrice fraîchement créée?

Note: v_cat et v_cont ont la forme suivante: df$variable1 , df$variable2

merci de votre aide

2voto

TarJae Points 9674

Similaire à la solution LMc(+1) -> Nous pourrions utiliser grep:

df <- structure(list(Mean = c(1, 1.5, 0.7, 0.3), Var = c(0.5, 0.4, 
0.3, 0.1), Max = c(3, 4, 2.5, 0.5)), class = "data.frame", row.names = c("a", 
"b", "c", "d"))

grep("Var", colnames(df))

sortie:

[1] 2

2voto

akrun Points 148302

Il n'est pas tout à fait clair sur la situation. Mais en fonction de la fonction fournie, elle peut être réécrite en passant le nom de la colonne et en sous-ensemble avec [[ au lieu de passer df$variable1 ou df$variable2

my_fct <- function(data, v_cont, v_cat){  
  mat_stat <- NULL
  for (i in 1:nlevels(as.factor(data[[v_cat]]))){      
      sub <- subset(data , data[[v_cat]] == 
              levels(as.factor(data[[v_cat]]))[i])     
      sub_stat <- c(levels(as.factor(data[[v_cat]]))[i],                    
                    mean(sub[,v_cat] , na.rm = TRUE)  
       mat_stat <- rbind(mat_stat, sub_stat)

    }
    return(mat_stat)
}

-testing

my_fct(df, "variable1", "variable2")

Avec la fonction originale de l'OP si l'entrée est df$variable1, df$variable2, une option est d'utiliser deparse(substitue pour capturer l'argument, extraire le nom de la colonne avec sub et l'utiliser comme nom de colonne

my_fct <- function(data, v_cont, v_cat){ 
  nm1 <- sub(".*\\$", "", deparse(substitute(v_cat)))
  mat_stat <- NULL
  for (i in 1:nlevels(as.factor(v_cat))){      
      sub <- subset(data , v_cat == levels(as.factor(v_cat))[i])     
      sub_stat <- c(levels(as.factor(v_cat))[i],                    
                    mean(sub[, nm1] , na.rm = TRUE)     
      mat_stat <- rbind(mat_stat, sub_stat)
      }

      return(mat_stat)

}

-testing

my_fct(df, df$variable1, df$variable2)

1voto

LMc Points 725

Utilisez match:

match("Var", colnames(df))

1voto

cgvoller Points 446

Cela devrait le faire en utilisant which

df <- data.frame(Mean=c(1,1.5,0.7,0.3),Var=c(0.5,0.4,0.3,0.1),Max=c(3,4,2.5,0.5))
df

  Mean Var Max
1  1.0 0.5 3.0
2  1.5 0.4 4.0
3  0.7 0.3 2.5
4  0.3 0.1 0.5

which(colnames(df)=="Var")

Sortie :

[1] 2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X