2016-08-29 1 views
-1

habe ich einen DatenrahmenZeichenfolge ersetzen nur in anderen Spalte, wenn die Bedingung erfüllt ist

test<-data.frame(A=c("aa","be","cg","dh"),B=c("i","i","i","i")) 

    A B 
1 aa i 
2 be i 
3 cg i 
4 dh i 

Ich möchte i in Spalte B mit yes nur, wenn in der Spalte B die Zeichenfolge e gefunden ersetzen ist.

Also am Ende, es ist wie dieses

A B 
1 aa i 
2 be yes 
3 cg i 
4 dh i 

aussehen sollte ich versucht habe

test[(grep("e", test$A)),] <- as.data.frame(lapply(test, gsub, pattern=  "i", replacement="yes", test$B)) 

während beide Teile separat arbeiten, wird die Kombination geben Sie mir nicht den Ausgang möchte ich

+0

Was haben Sie _tried_ unlesbar ist. Bitte geben Sie einen benutzerfreundlicheren Code an. – buhtz

+1

Dies ist eine ziemlich grundlegende Untermenge und Zuordnung. Lies 'help ("[") '. Die Lösung ist viel einfacher als das, was Sie haben. Zum Beispiel kann die rechte Seite durch "Ja" ersetzt werden. – lmo

Antwort

2

Es gibt viele Möglichkeiten, dies zu tun. Eine raffinierte Art und Weise dies in data.table zu tun:

test<-data.frame(A=c("aa","be","cg","dh"),B=c("i","i","i","i")) 
library(data.table) 
test = as.data.table(test) 
test[grepl("e",A),B := "yes"] 

oder in dplyr:

test<-data.frame(A=c("aa","be","cg","dh"),B=c("i","i","i","i")) 
library(dplyr) 
test = tbl_df(test) 
test %>% mutate(B = ifelse(grepl("e",A),"yes",B)) 
+0

Fyi, data.table bietet auch 'A% like%" e "' anstelle von 'grepl' an. – Frank

1

Erstens, stellen Sie sicher, dass Ihre Strings Strings sind und nicht die Faktoren:

test<-data.frame(A=c("aa","be","cg","dh"),B=c("i","i","i","i"), 
    stringsAsFactors=F) 

Dann ist diese wird funktionieren:

test[grep("e", test$A),]$B = 
    gsub(pattern= "i", replacement="yes", test[grep("e", test$A),]$B); 

Bessere sti ll ist data.frame-data.table zu wechseln, und es ist dann nur dies:

test[grepl("e", A), B := gsub("i", "yes", B)]; 

Hinweis: Dies setzt voraus, dass Sie „i“ in B mit „ja“, „ii“ mit „yesyes“ ersetzen wollen, " IAI“mit‚yesayes‘, etc ... wenn stattdessen wollen Sie nur den Wert von B auf‚ja e ‚‘, wenn A einen hat‘, dann das:

test[grepl("e", A), B := "yes"]; 

Oder wenn Sie festlegen möchten der Wert von B auf "ja", wenn B "i" ist und A ein "e" hat, dann ist dies:

test[B=="i" & grepl("e", A), B := "yes"]; 
1

Die ifelse Funktion ist praktisch, hier:

test$B <- ifelse(grepl("e", test$A), gsub("i", "yes", test$B), test$B) 
Verwandte Themen