2016-08-05 87 views
0

Ich habe einen Datenrahmen. Ich brauche für die Spalte „a“ suchen, und wenn „a“ gleich „foo“, Spalte „b“ gleich „gefunden“Fehler in Apply-Funktion: "Argumente implizieren unterschiedliche Anzahl von Zeilen: 1, 0"

a <- c("foo", "bar", "baz", "foo") 
b <- c(0, 0, 0, 0) 
df <- data.frame(a, b) 

f <- function (x){ 
    if (x["a"] == "foo"){ 
    x["b"] <- "confirm" 
    } 
} 

result <- apply(df, 1, f) 

Das beabsichtigte Ergebnis

a  b 
"foo" "confirm" 
"bar" 0 
"baz" 0 
"foo" "confirm" 

ist, aber wenn ich tun diese resultieren Erträge:

[[1]] 
[1] "confirm" 

[[2]] 
NULL 

[[3]] 
NULL 

[[4]] 
[1] "confirm" 

und View (Ergebnis) gibt den Fehler: Fehler anzeigen: Argumente implizieren unterschiedliche Anzahl der Zeilen: 1, 0

Fügt es dem Datenrahmen eine weitere Dimension hinzu?

+0

Eine Funktion zur 'return (x)' am Ende benötigt. – Frank

+0

Ich habe 'return (x)' hinzugefügt, aber im Ergebnis sind meine Zeilen und Spalten transponiert. –

+0

Ja, das ist ein negativer Nebeneffekt von 'apply'. Leute normalerweise 't()' am Ende, um es umzukehren oder zu versuchen, 'apply' zu vermeiden. – Frank

Antwort

0

Sie können dies ganz einfach mit ifelse und den mutate Befehl von dplyr

library(dplyr) 
a <- c("foo", "bar", "baz", "foo") 
b <- c(0, 0, 0, 0) 
df <- data.frame(a, b) 

result <- df %>% 
    mutate(b = ifelse(a == "foo", "confirm", b)) 

# a  b 
# 1 foo confirm 
# 2 bar  0 
# 3 baz  0 
# 4 foo confirm 

Wenn Sie Ihre eigene Funktion zu schreiben, stellen Sie sicher, dass es eine return-Anweisung hat (als Frank in seinem Kommentar sagte).

0

Um das Basispaket nur zu verwenden:

result <- data.frame(a, b=(ifelse(a=="foo","found",b)))

Verwandte Themen