Ich glaube, ich habe es geschafft, herauszufinden, was Sie fragen, aber wenn ich falsch liege, lassen Sie es mich wissen.
Sie versuchen, Spalten von prep
zu wählen, die die Werte in l1
und l2
, und die Summe über die Reihen, beschränkt sich auf die Spalten übereinstimmen, die jeweils abgestimmt.
Es ist immer besser reproduzierbare Daten zu liefern, hier einige für diesen Fall (dplyr
mit, es zu bauen):
sampData <-
rnorm(260) %>%
matrix(ncol = 26) %>%
data.frame() %>%
setNames(LETTERS)
var1 <- c("A", "B", "C")
var2 <- c("D", "E", "F", "G")
Dann brauchen Sie nicht auf alle Spaltenindizes verketten - Verwenden Sie einfach die Variable (oder in Ihrem Fall Spalte) direkt. Hier habe ich die Buchstaben der ID gemacht und die Buchstaben übereinstimmen. Wenn Ihre IDs jedoch numerisch sind, wird dieser Index übereinstimmen (z. B. 3
wird die dritte Spalte zurückgeben).
data.frame(
var1sums = rowSums(sampData[, var1])
, var2sums = rowSums(sampData[, var2])
)
Bemerkenswert ist, cat
kehrt NULL
nach auf dem Bildschirm zu drucken. Wenn Sie Werte verketten müssen, müssen Sie paste
(oder ähnlich) verwenden, aber das wird nicht funktionieren für das, was Sie hier versuchen.
Diese Frage hat mich über die Flexibilität solcher Lösungen nachdenken, also hier ist ein Versuch mit dplyr
und tidyr
, die effektiv das gleiche Ergebnis ergibt. Der Unterschied besteht darin, dass dies mehr Flexibilität für die variable Auswahl oder sogar die nachgelagerte Verarbeitung bietet.
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])
)
aber der wirkliche Vorteil kommen würde, wenn Sie eine beliebige Anzahl (oder nur eine große Anzahl im Allgemeinen) von Sätzen von Variablen haben, die Sie von den einzelnen Summen bekommen wollten. Anstatt jede Spalte, die Sie interessieren könnte, manuell zu konstruieren, können Sie die Standardauswertung (im Gegensatz zu Nicht-Standard) verwenden, um die Spalten basierend auf einer benannten Liste von Vektoren automatisch zu generieren:
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 = "', '")
, "')])")
})
)
Meine letzte Änderung wechselt zu mit reproduzierbaren Daten (wir haben keinen Zugriff auf Ihre SQL-Datenbanken) und verdeutlicht, wo die Fehlermeldungen auftreten. –