2011-12-05 34 views
7

Tôi đã có một khung dữ liệu như thế này mộtxoá các cột với cùng một giá trị từ một khung dữ liệu

1 1 1 K 1 K K 
2 1 2 K 1 K K 
3 8 3 K 1 K K 
4 8 2 K 1 K K 
1 1 1 K 1 K K 
2 1 2 K 1 K K 

Tôi muốn loại bỏ tất cả các cột với các giá trị như nhau, tức là K, vì vậy kết quả của tôi sẽ như thế nào này

1 1 1 1  
2 1 2 1 
3 8 3 1 
4 8 2 1 
1 1 1 1 
2 1 2 1 

Tôi cố gắng lặp lại theo từng cột nhưng tôi không nhận được gì. Ý tưởng nào? cảm ơn trước

+0

Tài khoản giải pháp có phải là số cũng như các ký tự/yếu tố không? –

+0

Vâng, đúng vậy, – user976991

Trả lời

4

Để chọn cột với nhiều hơn một giá trị bất kể loại:

uniquelength <- sapply(d,function(x) length(unique(x))) 
d <- subset(d, select=uniquelength>1) 

?

(Rất tiếc, câu hỏi của La Mã là đúng - điều này có thể knock out cột 5 cũng)

lẽ (chỉnh sửa: nhờ bình luận!)

isfac <- sapply(d,inherits,"factor") 
d <- subset(d,select=!isfac | uniquelength>1) 

hoặc

d <- d[,!isfac | uniquelength>1] 
+0

Việc bạn không làm việc cho tôi. Có thể 'd [,! Isfac | uniquelength! = 1] '? –

+0

nó không hoạt động cho tôi! Tôi thấy chính xác cùng một – user976991

+0

... Tôi "nhớ" ('? Subset') bây giờ,' tập hợp con' hoạt động trên _rows_. Để phá vỡ điều này, ta nên chỉ rõ 'select' một cách rõ ràng, vì vậy' tập con (d, select =! Isfac | uniquelength> 1) '. @ user976991, hãy thử điều đó. –

1

Một cách khác để thực hiện việc này là sử dụng hàm thứ tự cao hơn Filter. Đây là mã

to_keep <- function(x) any(is.numeric(x), length(unique(x)) > 1) 
Filter(to_keep, d) 
3

Dưới đây là một giải pháp mà sẽ làm việc để loại bỏ bất kỳ cột nhân rộng (bao gồm, ví dụ, cặp nhân vật được sao, số, hoặc cột yếu tố). Đó là cách tôi đọc câu hỏi của OP, và thậm chí nếu nó là một sự hiểu lầm, nó có vẻ giống như một câu hỏi thú vị nữa.

df <- read.table(text=" 
1 1 1 K 1 K K 
2 1 2 K 1 K K 
3 8 3 K 1 K K 
4 8 2 K 1 K K 
1 1 1 K 1 K K 
2 1 2 K 1 K K") 

# Need to run duplicated() in 'both directions', since it considers 
# the first example to be **not** a duplicate. 
repdCols <- as.logical(duplicated(as.list(df), fromLast=FALSE) + 
         duplicated(as.list(df), fromLast=TRUE)) 
# [1] FALSE FALSE FALSE TRUE FALSE TRUE TRUE 

df[!repdCols] 
# V1 V2 V3 V5 
# 1 1 1 1 1 
# 2 2 1 2 1 
# 3 3 8 3 1 
# 4 4 8 2 1 
# 5 1 1 1 1 
# 6 2 1 2 1 
2

Giải pháp oneliner.

df2 <- df[sapply(df, function(x) !is.factor(x) | length(unique(x))>1)] 
Các vấn đề liên quan