2016-10-06 7 views
-1

Ich versuche, einen neuen Datenrahmen mit 2 Spalten zu erstellen: var1 und var2, jeder von ihnen ist die Zeile Summe der spezifischen Spalten im Datenrahmen sampData.Wählen Sie Spalten mit einem Vektor

library(dplyr) 

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

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

Ich weiß, dass ich Spalten auswählen kann [] und c(), wie dies mit:

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

aber wenn ich versuche, dieses Format von meinen Vektoren so zu erzeugen und zu verwenden:

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

sampData[ ,d1_] 

Ich erhalte diesen Fehler:

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

Das bekomme ich auch, wenn ich versuche, die rowSums zu berechnen - was mich interessiert.

+0

Meine letzte Änderung wechselt zu mit reproduzierbaren Daten (wir haben keinen Zugriff auf Ihre SQL-Datenbanken) und verdeutlicht, wo die Fehlermeldungen auftreten. –

Antwort

0

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 = "', '") 
      , "')])") 
    }) 
) 
+0

Danke, ich habe die letzte Zeile zu diesem DF3 <-Daten geändert.Rahmen ( var1sums = rowSums (prep [, d1_]) , var2sums = rowSums (prep [, d2_]) ) aber ich erhielt den gleichen Fehler: Fehler in '[.data.frame' (prep, d1_): undefiniert Spalten ausgewählt – user4797853

+0

Sie sollten die Ausgabe von 'einfügen' überhaupt nicht in Ihrer Spaltenauswahl verwenden (wo kommt' d1_' und 'd2_' her). In Ihrem Beispiel sollten Sie 'new.variable1.v' und' new.variable2.v' verwenden. –

+0

Ich bin froh, dass es Ihnen geholfen hat. Sehen Sie sich meine Bearbeitung für eine potenziell allgemeinere Lösung an, wenn Sie interessiert sind. Ich werde auch einen Riss in der Bearbeitung Ihrer Frage nehmen, um zu klären, was Sie versuchen, zu tun. –

Verwandte Themen