2013-03-01 23 views
5

Tôi có dữ liệu với rời rạc x-giá trị, chẳng hạn nhưkẻ xuất Loại bỏ dễ dàng trong R

x = c(3,8,13,8,13,3,3,8,13,8,3,8,8,13,8,13,8,3,3,8,13,8,13,3,3) 
y = c(4,5,4,6,7,20,1,4,6,2,6,8,2,6,7,3,2,5,7,3,2,5,7,3,2); 

Làm thế nào tôi có thể tạo ra một tập dữ liệu mới của x và y giá trị nơi tôi loại bỏ các cặp giá trị mà giá trị y là 2 độ lệch chuẩn trên giá trị trung bình của thùng đó. Ví dụ: trong x = 3 bin, 20 lớn hơn 2 SD trên giá trị trung bình, do đó, cần xóa điểm dữ liệu đó.

Trả lời

6

cho tôi bạn muốn một cái gì đó như:

by(dat,dat$x, function(z) z$y[z$y < 2*sd(z$y)]) 
dat$x: 3 
[1] 4 1 6 5 7 3 2 
--------------------------------------------------------------------------------------------------------------- 
dat$x: 8 
[1] 4 2 2 2 3 
--------------------------------------------------------------------------------------------------------------- 
dat$x: 13 
[1] 3 2 

EDIT sau khi bình luận:

by(dat,dat$x, 
      function(z) z$y[abs(z$y-mean(z$y))< 2*sd(z$y)]) 

EDIT

Tôi hơi thay đổi by fu nction để có được x và y, sau đó tôi gọi rbind sử dụng do.call

do.call(rbind,by(dat,dat$x,function(z) { 
           idx <- abs(z$y-mean(z$y))< 2*sd(z$y) 
           z[idx,] 
      })) 

hoặc sử dụng plyr trong cuộc gọi đơn

ddply(dat,.(x),function(z) { 
       idx <- abs(z$y-mean(z$y))< 2*sd(z$y) 
        z[idx,]}) 
+1

nên được 'z $ y liuminzhao

+0

@liuminzhao Tôi nghĩ bạn đúng. – agstudy

+0

@liuminzhao Tôi cập nhật câu trả lời của mình. Tôi nghĩ rằng sai lầm của tôi đến từ việc xây dựng câu hỏi (tôi cần phải cải thiện tiếng Anh của tôi :)) – agstudy

1

Một cái gì đó như thế này?

newdata <- cbind(x,y)[-which(y>2*sd(y)), ] 

Hoặc bạn có ý nghĩa như thế này?

Data <- cbind(x,y) 
Data[-which(sd(y)>rowMeans(Data)), ] 
+0

Giải pháp này không loại bỏ giá trị ngoại biên trong 'y' bởi bin (* ví dụ: * riêng cho từng giá trị của' x'), mà là trên phạm vi toàn cầu – QkuCeHBH

+0

Đúng vậy. Nó nên được thực hiện bởi bin .. – CodeGuy

2

Bạn có thể sử dụng tapply cho điều này, nhưng bạn sẽ mất trật tự ban đầu của bạn.

tapply(y,x,function(z) z[abs(z-mean(z))<2*sd(z)]) 
$`3` 
[1] 4 1 6 5 7 3 2 

$`8` 
[1] 5 6 4 2 8 2 7 2 3 5 

$`13` 
[1] 4 7 6 6 3 2 7 
+0

Sau đó, tôi có thể cấu trúc lại thành danh sách các giá trị x và y như thế nào? – CodeGuy