2016-10-12 28 views
5

Để làm sạch một số dữ liệu lộn xộn Tôi muốn bắt đầu sử dụng đường ống%>%, nhưng tôi không nhận được mã R làm việc nếu gsub() không phải là lúc bắt đầu của đường ống , nên xảy ra muộn (Lưu ý: câu hỏi này không liên quan đến việc nhập khẩu thích hợp, nhưng với làm sạch dữ liệu)R: kết hợp một số gsub() chức năng ina ống

đơn giản ví dụ:

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

Cột A chứa các ký tự (trong trường hợp này con số, nhưng điều này cũng có thể là chuỗi) và cần phải được làm sạch. Các bước thực hiện

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

Một cách dễ dàng có thể ống

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

vấn đề này là các gsub thứ hai vì nó yêu cầu đầu vào .... mà thực sự là kết quả của các dòng trước đó.

Xin vui lòng, bất cứ ai có thể giải thích cách sử dụng các chức năng như gsub() tiếp tục xuống đường ống? Cảm ơn rất nhiều!

hệ thống: R 3.2.3, Windows

+1

Đề cập đến các gói bên ngoài bạn đang sử dụng. –

+0

Mặc dù không có gsub bạn có thể sử dụng 'df $ D <- gsub (" \\. "," ", Df $ A)%>% str_trim()%>% str_replace (',', '.')' –

+0

Trên thực tế, điều này có thể trùng lặp với http://stackoverflow.com/questions/36716710/combining-pipes-and-the-dot-placeholder-in-r –

Trả lời

10

Hãy thử điều này:

library(stringr) 

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

Với ống dữ liệu của bạn được thông qua như là một đối số đầu tiênđến chức năng tiếp theo, vì vậy nếu bạn muốn sử dụng nó ở một nơi khác bạn cần phải quấn dòng tiếp theo trong {} và sử dụng . làm dữ liệu "điểm đánh dấu".

+0

Ah, cảm ơn, đó là chức năng cơ bản mà tôi đã bỏ qua. Cảm ơn rất nhiều vì đã giải thích điều này! – user2006697

+0

Hãy nhớ rằng bạn cũng có thể sử dụng '.' nhiều lần. –

+0

Nhưng như được hiển thị trong câu trả lời của tôi, không cần sử dụng '.'. – ddiez

1

Vấn đề là đối số được đưa vào đường ống cần phải là đối số đầu tiên trong danh sách đối số. Nhưng đây không phải là trường hợp của gsub(), vì x là trường hợp thứ ba. Giải pháp A (wordy) có thể là:

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

Thông thường, một ống áp dụng cho toàn bộ khung dữ liệu như thế này trả về khung dữ liệu đã được làm sạch. Ý tưởng lập trình chức năng là các đối tượng không thay đổi và không thay đổi tại chỗ mà là các đối tượng mới được tạo ra.

library(dplyr) 

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

Cũng lưu ý rằng những lựa chọn thay thế làm việc:

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 = ",")) 

Ví dụ đặc biệt này type.convert dường như thích hợp nhất vì nó gọn thể hiện ở mức độ cao những gì chúng ta có ý định làm. Trong khi đó, các giải pháp gsub/as.numeric có vẻ quá thấp và tiết trong khi read.table thêm chuyển đổi vào data.frame mà chúng ta cần hoàn tác để làm cho nó quá cao.