2016-10-12 35 views
5

Boruları%>% kullanmaya başlamak istiyorum bazı dağınık verileri temizlemek için, ama gsub() borunun başında değilse ben çalışıyorum R kodu almak için başarısız (: ama veri temizlikle, bu soru doğru ithalat ile ilgili değildir not)R: yiyeceklerden oluşan gsub() fonksiyonu ina boru

Basit bir örnek: geç gerçekleşmelidir

df <- cbind.data.frame(A= c("2.187,78 ", "5.491,28 ", "7.000,32 "), B = c("A","B","C")) 

Sütun A, bu durumda sayıları (karakterler içeriyor ancak bu da olabilir dize) ve temizlenmesi gerekiyor. adımlar Giriş .... önceki satırın aslında sonuç sorar çünkü

df$D <- gsub("\\.","",df$A) 
df$D <- str_trim(df$D) 
df$D <- as.numeric(gsub(",", ".",df$D)) 

biri kolayca could boru bu

df$D <- gsub("\\.","",df$A) %>% 
      str_trim() %>% 
      as.numeric(gsub(",", ".")) %>% 

sorun ikinci gsub olduğunu vardır.

, herkes gsub gibi işlevleri nasıl kullanılacağını açıklayabilir Lütfen() ayrıca boru hattı kapanacak? Çok teşekkürler!

sistemi: Veri sonraki işleve bir ilk argüman olarak geçirilen boru ile

library(stringr) 

df$D <- df$A %>% 
    { gsub("\\.","", .) } %>% 
    str_trim() %>% 
    { as.numeric(gsub(",", ".", .)) } 

, bu yüzden isterseniz kullanmak: R 3.2.3 Windows

+1

kullandığınız harici paketleri bahsedin. –

+0

gsub ile olmasa bile, df $ D <- gsub ("\\.", "", Df $ A)%>% str_trim()%>% str_replace (',', '.') ' –

+0

kullanabilirsiniz. Aslında bu, http://stackoverflow.com/questions/36716710/combining-pipes-and-the-dot-placeholder-in-r –

cevap

10

bu deneyin başka bir yerde sen {} sonraki çizgisini sarın ve bir veri "işaretleyici" olarak . kullanmak gerekir.

+0

Ah ile teşekkürler, teşekkürler, bu benim özledim temel işlevsellik. Bunu açıkladığın için çok teşekkürler! – user2006697

+0

Ayrıca, birden çok kez '.' kullanabilirsiniz. –

+0

Ama cevabımda da görüldüğü gibi '.' kullanmak gerekli değildir. – ddiez

1

sorun borusuna beslenir bağımsız değişken bağımsız değişkenleri listesinde ilk olmak gerekiyor. x üçüncüsü olduğu gibi bu, gsub() için durum böyle değildir. A (ağız) çözüm olabilir:

df$A %>% 
    gsub(pattern = "\\.", replacement="") %>% 
    str_trim() %>% 
    gsub(patter = ",", replacement = ".") %>% 
    as.numeric 
6

Normal olarak bir temizlenmiş veri çerçevesini dönen böyle bir bütün olarak veri çerçevesine boruları uygulanır. Fonksiyonel programlama fikri, nesnelerin değişmez olduğu ve yer değiştirmediği, aksine yeni nesnelerin oluşturulduğu düşüncesidir. Bu sayede kompakt biz ne yapmak niyetinde yüksek bir seviyede ifade beri

bu özel örnekte type.convert için
df %>% mutate(C = gsub("\\.", "", A), C = gsub(",", ".", C), C = as.numeric(C)) 


df %>% mutate(C = read.table(text = gsub("[.]", "", A), dec = ",")[[1]]) 


df %>% mutate(C = type.convert(gsub("[.]", "", A), dec = ",")) 

en uygun görünüyor:

library(dplyr) 

df %>% 
    mutate(C = gsub("\\.", "", A)) %>% 
    mutate(C = gsub(",", ".", C)) %>% 
    mutate(C = as.numeric(C)) 

Ayrıca bu alternatifler performans gösterdiğini unutmayın. Buna karşılık, gsub/as.numeric çözümleri çok düşük ve verbose olarak görünürken, read.table ise çok yüksek seviyede geri almamız gereken data.frame'e dönüşüm ekler.