2016-10-06 1 views
-1

J'essaie de créer une nouvelle trame de données avec 2 colonnes: var1 et var2, chacune d'entre elles étant la somme de lignes de colonnes spécifiques dans le bloc de données sampData.Sélection de colonnes à l'aide d'un vecteur

library(dplyr) 

sampData <- 
    rnorm(260) %>% 
    matrix(ncol = 26) %>% 
    data.frame() %>% 
    setNames(LETTERS) 

var1 <- c("A", "B", "C") 
var2 <- c("D", "E", "F", "G") 

Je sais que je peux sélectionner les colonnes à l'aide [] et c(), comme ceci:

sampData[ ,c("A","B")] 

mais lorsque je tente de générer et d'utiliser ce format de mes vecteurs comme ceci:

d1_ <-paste(var1, collapse=",") 
d2_ <-paste(var2, collapse=",") 

sampData[ ,d1_] 

Je reçois cette erreur:

Error in `[.data.frame`(sampData, , d1_) : undefined columns selected 

Ce que j'obtiens aussi si j'essaie de calculer le rowSums - ce qui m'intéresse.

data.frame(var1 = rowSums(sampData[ , d1_]) 
      , var2 = rowSums(sampData[ , d2_]) 
+0

Ma modification récente passe à en utilisant des données reproductibles (nous n'avons pas accès à vos bases de données sql) et clarifie où les messages d'erreur se produisent. –

Répondre

0

Je pense que j'ai réussi à comprendre ce que vous demandez, mais si je me trompe, faites le moi savoir.

Vous essayez de sélectionner des colonnes de prep qui correspondent aux valeurs l1 et l2, et somme à travers les lignes, limitées aux colonnes qui correspondent chacun.

Il est toujours préférable de fournir des données reproductibles, voici quelques pour ce cas (en utilisant dplyr pour le construire):

sampData <- 
    rnorm(260) %>% 
    matrix(ncol = 26) %>% 
    data.frame() %>% 
    setNames(LETTERS) 

var1 <- c("A", "B", "C") 
var2 <- c("D", "E", "F", "G") 

Ensuite, vous n'avez pas besoin de concaténer les indices de colonne du tout - utilisez simplement la variable (ou la colonne, dans votre cas) directement. Ici, j'ai fait les lettres d'identification et correspondra aux lettres. Toutefois, si vos ID sont numériques, ils correspondent à cet index (par exemple, 3 renverra la troisième colonne).

data.frame(
    var1sums = rowSums(sampData[, var1]) 
    , var2sums = rowSums(sampData[, var2]) 
) 

à noter, cat retours NULL après l'impression à l'écran. Si vous devez concaténer des valeurs, vous devrez utiliser paste (ou similaire), mais cela ne fonctionnera pas pour ce que vous essayez de faire ici.

Cette question m'a fait penser à la flexibilité de telles solutions, donc voici une tentative en utilisant dplyr et tidyr, qui donne effectivement le même résultat. La différence est que cela peut fournir plus de flexibilité pour la sélection de variables ou même le traitement en aval.

sampData %>% 
    # add column for individual 
    mutate(ind = 1:nrow(.)) %>% 
    # convert data to long format 
    gather("Variable", "Value", -ind) %>% 
    # Set to group by the individual we added above 
    group_by(ind) %>% 
    # Calculate sums as desired 
    summarise(
    var1sums = sum(Value[Variable %in% var1]) 
    , var2sums = sum(Value[Variable %in% var2]) 
) 

Cependant, l'avantage réel viendrait si vous aviez un nombre arbitraire (ou juste un grand nombre en général) des ensembles de variables que vous vouliez obtenir les sommes individuelles de. Au lieu de construire manuellement chaque colonne qui vous intéresse, vous pouvez utiliser l'évaluation standard (par opposition à non standard) pour générer automatiquement les colonnes en fonction d'une liste de vecteurs nommée:

sampData %>% 
    mutate(ind = 1:nrow(.)) %>% 
    gather("Variable", "Value", -ind) %>% 
    group_by(ind) %>% 
    # Calculate one column for each vector in `varList` 
    summarise_(
    .dots = lapply(varList, function(x){ 
     paste0("sum(Value[Variable %in% c('" 
      , paste(x, collapse = "', '") 
      , "')])") 
    }) 
) 
+0

Merci, j'ai changé la dernière ligne à cette DF3 <-data.frame ( var1sums = rowSums (prep [, d1_]) , var2sums = rowSums (prep [, d2_]) ) mais j'ai reçu la même erreur: Erreur dans '[.data.frame' (prep, d1_): undefined colonnes sélectionnées – user4797853

+0

Vous ne devriez pas utiliser la sortie de 'paste' du tout dans votre sélection de colonne (d'où proviennent d1_' et' d2_'). Pour votre exemple, vous devriez utiliser 'new.variable1.v' et' new.variable2.v' –

+0

Heureux que cela vous a aidé, voyez ma modification pour une solution potentiellement plus générale si vous êtes intéressé. Je vais aussi essayer de modifier votre question pour clarifier ce que vous essayez de faire. –