2013-05-10 26 views
6

Tôi cần phải thả một cột từ một tệp dữ liệu. Khung chứa một vài trăm cột.Thành ngữ để xóa một cột đơn lẻ trong một dữ liệu. Có thể là

Với data.frame, tôi muốn sử dụng subset để làm điều này thuận tiện:

> dat <- data.table(data.frame(x=runif(10),y=rep(letters[1:5],2),z=runif(10)),key='y') 
> subset(dat,select=c(-z)) 
      x y 
1: 0.1969049 a 
2: 0.7916696 a 
3: 0.9095970 b 
4: 0.3529506 b 
5: 0.4923602 c 
6: 0.5993034 c 
7: 0.1559861 d 
8: 0.9929333 d 
9: 0.3980169 e 
10: 0.1921226 e 

Rõ ràng đây vẫn hoạt động, nhưng nó có vẻ như không phải là một rất data.table -like thành ngữ. Tôi có thể tự xây dựng một danh sách các tên cột tôi muốn giữ lại, mà dường như nhiều hơn một chút data.table -like:

> dat[,list(x,y)] 
      x y 
1: 0.1969049 a 
2: 0.7916696 a 
3: 0.9095970 b 
4: 0.3529506 b 
5: 0.4923602 c 
6: 0.5993034 c 
7: 0.1559861 d 
8: 0.9929333 d 
9: 0.3980169 e 
10: 0.1921226 e 

Nhưng sau đó tôi phải xây dựng một danh sách như vậy, mà thiếu uyển chuyển.

Có phải là subset cách thích hợp để thuận tiện thả một hoặc hai cột hoặc nó có gây ra hiệu suất không? Nếu không, cách tốt hơn là gì?

Sửa

Benchmarks:

> dat <- data.table(data.frame(x=runif(10^7),y=rep(letters[1:10],10^6),z=runif(10^7)),key='y') 
> microbenchmark(subset(dat,select=c(-z)), dat[,list(x,y)]) 
Unit: milliseconds 
         expr  min  lq median  uq  max 
1   dat[, list(x, y)] 102.62826 167.86793 170.72847 199.89789 792.0207 
2 subset(dat, select = c(-z)) 33.26356 52.55311 53.53934 55.00347 180.8740 

Nhưng thực sự, nơi nó có thể quan trọng hơn là cho bộ nhớ nếu subset bản sao toàn bộ data.table.

+0

Một câu hỏi: ý định của bạn là bỏ cột này là gì? Tôi có nghĩa là bạn sẽ làm gì với data.table kết quả? – Arun

+0

@Arun Trường hợp cụ thể khiến tôi hỏi, tôi đã đặt tên sai cột khi tạo bằng ': =' và muốn thả nó. Nhưng nó đi lên tất cả các thời gian mà bán phá giá một hoặc hai cột là tiện dụng. –

+1

Khi @mnel giải thích, nếu bạn muốn xóa, bạn có thể trực tiếp sử dụng toán tử ': =' và nếu bạn muốn thực hiện các phép tính không có cột này, thì bạn luôn có thể sử dụng '.SDcols'. Vì vậy, bạn có thể tránh hoàn toàn 'tập hợp con'/'với giải pháp = FALSE'. – Arun

Trả lời

9

Nếu bạn đang muốn loại bỏ các cột vĩnh viễn sử dụng := NULL

dat[, z := NULL] 

Nếu bạn có các cột của bạn để thả như một chuỗi ký tự sử dụng () để buộc đánh giá như một chuỗi ký tự, không phải là tên nhân vật.

toDrop <- c('z') 

dat[, (toDrop) := NULL] 

Nếu bạn muốn giới hạn sự sẵn có của các cột trong .SD, bạn có thể vượt qua đối số .SDcols

dat[,lapply(.SD, somefunction) , .SDcols = setdiff(names(dat),'z')] 

Tuy nhiên, data.table kiểm tra các j luận và chỉ được các cột mà bạn sử dụng bất kỳ cách nào. Xem Câu hỏi thường gặp 1.12

Khi bạn viết X [Y, tổng (foo * bar)], dữ liệu.table tự động kiểm tra biểu thức j để xem cột nào sử dụng.

và không cố gắng và tải tất cả các dữ liệu cho .SD (trừ khi bạn có .SD trong cuộc gọi của bạn để j)


subset.data.table đang xử lý cuộc gọi và cuối cùng đánh giá dat[, c('x','y'), with=FALSE]

sử dụng := NULL về cơ bản tức thời, howveer t xóa vĩnh viễn cột.

+2

mnel cho biết: "Use'()' để buộc đánh giá dưới dạng chuỗi ký tự ".... Tôi đã cố gắng tìm ra cách thực hiện điều đó trong nhiều tuần. Mẹo nhỏ đó xứng đáng với Q & A của riêng mình. –

1

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm.

dat[, !c("z"), with = FALSE] 

Đây là điểm chuẩn trên dữ liệu khổng lồ từ bản chỉnh sửa của bạn.

Unit: milliseconds 
         expr  min  lq median  uq  max neval 
    subset(dat, select = c(-z)) 53.37435 56.82514 61.81279 100.3458 339.1400 100 
      dat[, list(x, y)] 191.46678 354.39905 412.06421 451.3933 678.3981 100 
dat[, !c("z"), with = FALSE] 53.49184 57.31756 62.15506 112.7063 398.0107 100 
+0

'subset.data.table' giống với cuộc gọi của bạn bởi vì chúng đang làm điều tương tự, hãy xem' getAnywhere ('subset.data.table') ' – mnel

+0

Tôi thích cú pháp này thành' subset' hơn vì [** this post * *] (http://stackoverflow.com/questions/9860090/in-r-why-is-better-than-subset). Tôi cho rằng cùng một đối số có thể được mở rộng thành 'data.table' – Arun

+0

@Arun Care để giải thích cách hoạt động của nó? Tại sao tùy chọn 'with' cần phải là' FALSE', chẳng hạn? –

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