174 votes

Sélectionner dynamiquement les colonnes d'un cadre de données en utilisant $ et une valeur de caractère

J'ai un vecteur de différents noms de colonnes et je veux pouvoir boucler sur chacun d'entre eux pour extraire cette colonne d'un data.frame. Par exemple, considérons l'ensemble de données mtcars et certains noms de variables stockés dans un vecteur de caractères cols . Lorsque j'essaie de sélectionner une variable dans mtcars en utilisant un sous-ensemble dynamique de cols mais aucun de ces éléments ne fonctionne

cols <- c("mpg", "cyl", "am")
col <- cols[1]
col
# [1] "mpg"

mtcars$col
# NULL
mtcars$cols[1]
# NULL

comment puis-je faire en sorte qu'elles renvoient les mêmes valeurs que celles de l'option

mtcars$mpg

De plus, comment puis-je faire une boucle sur toutes les colonnes dans le fichier cols pour obtenir les valeurs dans une sorte de boucle.

for(x in seq_along(cols)) {
   value <- mtcars[ order(mtcars$cols[x]), ]
}

0voto

Hong Ooi Points 17761
mtcars[do.call(order, mtcars[cols]), ]

0voto

R Keene Points 63

J'ai eu un problème similaire à cause de certains fichiers CSV qui avaient différents noms pour la même colonne.
C'était la solution :

J'ai écrit une fonction pour retourner le premier nom de colonne valide dans une liste, puis j'ai utilisé cette...

# Return the string name of the first name in names that is a column name in tbl
# else null
ChooseCorrectColumnName <- function(tbl, names) {
for(n in names) {
    if (n %in% colnames(tbl)) {
        return(n)
    }
}
return(null)
}

then...

cptcodefieldname = ChooseCorrectColumnName(file, c("CPT", "CPT.Code"))
icdcodefieldname = ChooseCorrectColumnName(file, c("ICD.10.CM.Code", "ICD10.Code"))

if (is.null(cptcodefieldname) || is.null(icdcodefieldname)) {
        print("Bad file column name")
}

# Here we use the hash table implementation where 
# we have a string key and list value so we need actual strings,
# not Factors
file[cptcodefieldname] = as.character(file[cptcodefieldname])
file[icdcodefieldname] = as.character(file[icdcodefieldname])
for (i in 1:length(file[cptcodefieldname])) {
    cpt_valid_icds[file[cptcodefieldname][i]] <<- unique(c(cpt_valid_icds[[file[cptcodefieldname][i]]], file[icdcodefieldname][i]))
}

0voto

CashC Points 1

Ça m'est arrivé plusieurs fois. Utilisez le paquet data.table. Lorsque vous n'avez qu'une seule colonne à laquelle vous devez vous référer. Utilisez soit

DT[[x]]

ou

DT[,..x]

Lorsque vous avez 2 ou plusieurs colonnes auxquelles vous devez vous référer, veillez à utiliser :

DT[,..x]

Ce x peut être des chaînes dans un autre data.frame.

-1voto

makarand kulkarni Points 106

Si vous voulez sélectionner une colonne avec un nom spécifique, il suffit de faire

A <- mtcars[,which(conames(mtcars)==cols[1])]
# and then
colnames(mtcars)[A]=cols[1]

vous pouvez aussi le faire tourner en boucle manière inverse d'ajouter un nom dynamique, par exemple si A est un cadre de données et que xyz est une colonne qui doit être nommée x, je fais comme ceci

A$tmp <- xyz
colnames(A)[colnames(A)=="tmp"]=x

encore une fois, cela peut aussi être ajouté en boucle

-1voto

ValaravausBlack Points 611

Trop tard mais je crois que j'ai la réponse -

Voici mon échantillon de dataframe study.df -

   >study.df
   study   sample       collection_dt other_column
   1 DS-111 ES768098 2019-01-21:04:00:30         <NA>
   2 DS-111 ES768099 2018-12-20:08:00:30   some_value
   3 DS-111 ES768100                <NA>   some_value

Et puis

> ## Selecting Columns in an Given order
> ## Create ColNames vector as per your Preference
> 
> selectCols <- c('study','collection_dt','sample')
> 
> ## Select data from Study.df with help of selection vector
> selectCols %>% select(.data=study.df,.)
   study       collection_dt   sample
1 DS-111 2019-01-21:04:00:30 ES768098
2 DS-111 2018-12-20:08:00:30 ES768099
3 DS-111                <NA> ES768100
>

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