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 = "', '")
, "')])")
})
)
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. –