2016-04-08 18 views
0

Ich habe einen Datenrahmen (df), einen Vektor von Spaltennamen (foo) und eine Funktion (Leerzeichen), die einen Wert für alle Zeilen in einer angegebenen Spalte eines DF berechnet . Ich versuche, die Folgendes zu erreichen:R: Fehler: Unerwartetes '=' in

  1. Privat foo als Eingang zu den Räumen für jedes Element von foo einen Spaltennamen in df
  2. Spaces arbeitet
  3. für jede Spalte Räumen arbeitet auf passende, speichern Sie die Ausgabe von Leerzeichen in einer neuen Spalte von df mit einem Spaltennamen, der durch Verketten des Namens der ursprünglichen Spalte und ".counts" erzeugt wird.

Ich halte empfangen Fehler:

> Error: unexpected '=' in: 
>"  new[i] <- paste0(foo[i],".count") # New variable name 
> data <- transform(data, new[i] =" 
> } 
> Error: unexpected '}' in " }" 

Unten ist mein Code. Anmerkung: spaces macht was ich will, wenn es eine Eingabe einer einzelnen Variablen der Form df $ x liefert, aber die Verwendung von transform() sollte es mir ermöglichen, auf das Präfix df $ für jede Variable zu verzichten.

# Create data for example 
a <- c <- seq(1:5) 
b <- c("1","1 2", "1 2 3","1 2 3 4","1 2 3 4 5") 
d <- 10 
df <- data.frame(a,b,c,d) # data fram df 
foo <- c("a","b") # these are the names of the columns I want to provide to spaces 

# Define function: spaces 
spaces <- function(s) { sapply(gregexpr(" ", s), function(p) { sum(p>=0) }) } 

# Initialize vector with new variable names 
new <- vector(length = length(foo)) 

# Create loop with following steps: 
    # (1) New variable name 
    # (2) Each element (e.g. "x") of foo is fed to spaces 
    #  a new variable (e.g. "x.count") is created in df, 
    #  this new df overwrites the old df 

for (i in 1:length(foo)) { 
    new[i] <- paste0(foo[i],".count") # New variable name 
    df <- transform(df, new[i] = spaces(foo[i])) # Function and new df 
} 

Antwort

1

transform(df, new[i] = spaces(foo[i])) ist keine gültige Syntax. Sie können Argumentnamen nicht nach einem Index abrufen. Erstellen Sie eine temporäre Zeichenfolge und verwenden Sie diese.

for (i in 1:length(foo)) { 
    new[i] <- paste0(foo[i],".count") # New variable name 
    tmp <- paste0(new[i], ".counts") 
    df <- transform(df, tmp = spaces(foo[i])) # Function and new df 
} 
+0

Dies erzeugt eine neue Spalte mit dem Namen „tmp“, aber (1) Ich möchte, dass jeder neue Spalte einen anderen Namen haben wie folgt: für alte Spalte x, sollten neue Spalte x.counts, dh c (x sein, ".zählungen"). (2) Die Spalte erzeugt eine Reihe von Nullen. Ich habe das Beispiel bearbeitet, indem ich b in einen Vektor geändert habe, der am Ende Werte ungleich Null erzeugen sollte. – user3614648

+0

@ user3614648 das ist einfach. Verwenden Sie eine der Funktionen zum Verketten von Zeichenfolgen. Ich habe 'paste0' verwendet. –