2013-05-14 12 views
5

Próbuję zastąpić pewien ciąg w dużej data.frame. Właśnie znalazłem następujące rozwiązanie, ale gsub nie zachowuje oryginalnego układu data.frame. Jak mogę to osiągnąć.Zamień ciąg w ramce danych

Chodzi mi o to, że chcę zastąpić ciąg i nie chcę zmieniać układu df.

Rozważmy następujący przykład:

test<-data.frame(a=c("a","b","c","d"),b=c("a","e","g","h"),c=c("i","j","k","a")) 
gsub("a","new",test) 

THX

Odpowiedz

14

będzie chciał lapply dzięki swojej data.frame testów dla character lub factor wpisów i następnie zastosowanie gsub odpowiednio. Rezultatem będzie list, ale as.data.frame to naprawi.

test$val <- 1:4 # a non character/factor variable 
(test2 <- as.data.frame(lapply(test,function(x) if(is.character(x)|is.factor(x)) gsub("a","new",x) else x))) 
    a b c val 
1 new new i 1 
2 b e j 2 
3 c g k 3 
4 d h new 4 
class(test2$val) # to see if it is unchanged 
[1] "integer" 
+0

dlaczego zawinąłeś całe wyrażenie w nawiasach? –

+3

@RichardSmith To sprawia, że ​​wyrażenie zwraca wynik wyraźnie do konsoli. Zadanie jest zwykle zwracane niewidocznie. – James

6
as.data.frame(sapply(test, function(x) gsub("a", "new", x))) 
+0

Dzięki, ale to daje mi matrycę znaków, moja df ma wartości liczbowe też potem napotkasz problemy podczas przetwarzania danych dodatkowo – rainer

+1

właśnie pracy z np. – Thomas