2016-05-06 27 views
8

Tôi có khung dữ liệu với 300 cột dữ liệu. Tôi đã tạo một vectơ với 126 phần tử là tên cột là 126 của 300. Tôi muốn chia nhỏ 300 dựa trên không nằm trong 126 của tôi. Chúng KHÔNG theo thứ tự, vì vậy tôi không thể đơn giản loại bỏ bằng cách chỉ định - 1: -126.Chọn tập hợp các cột dựa trên Vector R

Tôi đã thử nhiều thứ khác nhau với các phép toán grep và ma trận, nhưng chúng không hoạt động. Chẳng hạn như những điều sau đây đã không làm việc. x có 300 cột. f chứa vector của 126 tên cột mà tôi muốn loại trừ khỏi x1.

x1<-x[,-which(names(x), %in% f)] 

Nếu tôi dứt khoát sử dụng tên biến hoặc một số, tôi có thể làm cho nó hoạt động, nhưng tôi không muốn loại bỏ 126 phần tử trong f.

+0

Để biết thêm chi tiết, tôi muốn có thể sử dụng các phần tử trong f như thể tôi đã chỉ định f = c (element1of_f, element2of_f, ..., element126of_f) – akaDrHouse

+4

'x [,! Name (x)% in% f] '? – Sotos

+1

bạn đã sử dụng lựa chọn từ dplyr với các đối số: start_with, end_with, contains ...? –

Trả lời

1

Cảm ơn tất cả đã trả lời quá nhanh. Một vài giải pháp của bạn đã hoạt động. Tôi nhận ra vấn đề lớn nhất mà tôi có là tôi không phải là một vector thực sự! Và một khi tôi đã làm, nó vẫn đang được coi là một yếu tố! Vì vậy, tôi nghĩ rằng tôi sẽ đăng những gì tôi đã làm với sự giúp đỡ của bạn để sửa chữa nó.

f <- select(filter(hash_t,(variable %in% c("a",...,"z"))),X) #wasn't a vector... 
f[,1]<-sapply(f[,1],as.character) # had to remove factor info from f; still not a vector... 
f<-f[,1] # Now I had a vector! 
x1<-x[,!names(x) %in$ f] #worked! 

Nhiều ý kiến ​​đã được đăng. Tôi chỉ có một vấn đề với các tiêu chí lựa chọn của tôi không phải là một vector thích hợp và có một số vấn đề yếu tố liên quan đến nó.

+0

Một vài giải pháp có hiệu quả? Chỉ có hai câu trả lời khác với câu trả lời của bạn. Nói chung, khi bạn đặt câu hỏi, bạn nên đánh dấu câu trả lời đúng. Nếu không thực sự trả lời câu hỏi của bạn thì bạn không đánh dấu, nhưng đánh dấu làm cho câu hỏi của bạn có giá trị hơn cho người khác với một vấn đề tương tự. –

+0

Vâng, nhận xét của Soto là đầu tiên và chính xác và đơn giản ... nhưng không được đăng là câu trả lời. Cả hai câu trả lời sửa đổi của bạn hoạt động, cũng như của Rafael.Lý do tôi không thể có được phương pháp như vậy để làm việc ban đầu là xây dựng không chính xác của tôi một vector để tập hợp với. Đó là lý do tại sao tôi đăng câu trả lời của mình; để giúp những người khác có thể có vấn đề tương tự. Tôi nghĩ nó có chút phô trương để đánh dấu câu trả lời của chính mình là đúng ... và nó sẽ không cho phép tôi; Tôi chỉ cố gắng :) – akaDrHouse

3

Sử dụng %in%:

names.use <- names(df)[!(names(df) %in% f)] 

Sau đó names.use sẽ chứa tên của tất cả các cột đó là không chứa trong vector của bạn tên f.

Để tập hợp con khung dữ liệu của bạn bằng cách sử dụng cột mà bạn muốn, bạn có thể sử dụng như sau:

df.subset <- df[, names.use] 
+0

Tôi đã thử điều này và nó đã chọn các tên khác, nhưng không phải là dữ liệu. Nó định nghĩa một vector với các tên tôi muốn, nhưng không có dữ liệu. – akaDrHouse

+0

Chỉ cần đặt khung dữ liệu ban đầu của bạn bằng cách sử dụng các cột bạn muốn. –

3

Dưới đây là một giải pháp data.table với một ví dụ tái sản xuất.

# load library 
    library(datat.table) 

# get data 
    data(iris) 

# convert your dataset into data.table 
    setDT(iris) 

# vector of columns you DON'T want 
    f <- c("Sepal.Width","Petal.Length") 


# subset 
    output <- iris[, !f, with = FALSE] 
1

Bạn cũng có thể làm:

subset(x, select=f) 

Không giống như sử dụng% trong%, điều này sẽ ném ra một lỗi nếu một trong các giá trị trong f không phải là một tên cột trong x, mà có thể hữu ích để phát hiện lỗi chính tả nếu bạn đã nhập một số cách thủ công.

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