2012-08-04 41 views
26

Tôi không tìm thấy trang trợ giúp cho hàm replace từ gói base thành rất hữu ích. Phần tồi tệ nhất, nó không có ví dụ nào có thể giúp hiểu cách hoạt động của nó.thay thế các ví dụ chức năng

Bạn có thể giải thích cách sử dụng không? Một ví dụ hoặc hai sẽ là tuyệt vời.

Trả lời

30

Nếu bạn nhìn vào các chức năng (bằng cách gõ tên của nó vào giao diện điều khiển), bạn sẽ thấy rằng nó chỉ là một phiên bản chức năng hóa đơn giản của [<- chức năng được mô tả ở ?"[" . [ là một chức năng khá cơ bản để R vì vậy bạn sẽ được tư vấn tốt để xem trang đó để biết thêm chi tiết. Đặc biệt quan trọng là biết rằng đối số chỉ số (đối số thứ hai trong replace có thể hợp lý, số hoặc giá trị ký tự phân loại tái chế sẽ xảy ra khi có những khác nhau độ dài của các đối số thứ hai và thứ ba:.

> replace(1:20, 10:15, 1:2) 
[1] 1 2 3 4 5 6 7 8 9 1 2 1 2 1 2 16 17 18 19 20 

Character lập chỉ mục cho một tên vector:

> replace(c(a=1, b=2, c=3, d=4), "b", 10) 
a b c d 
1 10 3 4 

logic lập chỉ mục:

> replace(x <- c(a=1, b=2, c=3, d=4), x>2, 10) 
a b c d 
1 2 10 10 
8

Dưới đây là hai ví dụ đơn giản

> x <- letters[1:4] 
> replace(x, 3, 'Z') #replacing 'c' by 'Z' 
[1] "a" "b" "Z" "d" 
> 
> y <- 1:10 
> replace(y, c(4,5), c(20,30)) # replacing 4th and 5th elements by 20 and 30 
[1] 1 2 3 20 30 6 7 8 9 10 
11

Bạn cũng có thể sử dụng logic kiểm tra

x <- data.frame(a = c(0,1,2,NA), b = c(0,NA,1,2), c = c(NA, 0, 1, 2)) 
x 
x$a <- replace(x$a, is.na(x$a), 0) 
x 
x$b <- replace(x$b, x$b==2, 333) 
1

Lưu ý rằng tham số thứ ba (giá trị) trong các ví dụ được đưa ra ở trên: giá trị là hằng số (ví dụ: 'Z' hoặc c (20,30)).

Xác định thông số thứ ba sử dụng các giá trị từ chính khung dữ liệu có thể dẫn đến nhầm lẫn.

Ví dụ: với một khung dữ liệu đơn giản như thế này (sử dụng dplyr :: data_frame):

tmp <- data_frame(a=1:10, b=sample(LETTERS[24:26], 10, replace=T)) 

này sẽ tạo somthing như thế này:

 a  b 
    (int) (chr) 
1  1  X 
2  2  Y 
3  3  Y 
4  4  X 
5  5  Z 

..etc

Bây giờ giả sử bạn muốn muốn làm, là nhân các giá trị trong cột 'a' cho 2, nhưng chỉ ở nơi cột 'b' là "X". Suy nghĩ tức thì của tôi sẽ giống như sau:

with(tmp, replace(a, b=="X", a*2)) 

Điều đó sẽ không cung cấp kết quả mong muốn. Dấu * 2 sẽ được định nghĩa là một vector cố định chứ không phải là tham chiếu đến cột 'a'. Do đó, vectơ 'a * 2' sẽ là

[1] 2 4 6 8 10 12 14 16 18 20 

khi bắt đầu hoạt động 'thay thế'. Do đó, hàng đầu tiên trong đó 'b' bằng "X", giá trị trong 'a' sẽ được đặt bởi 2. Lần thứ hai, nó sẽ được thay thế bằng 4, vv ... nó sẽ không được thay thế bằng hai lần -giá trị-of-a trong hàng cụ thể đó.

Các vấn đề liên quan