2015-11-22 29 views
5

từ data.table đơn giản của tôi, ví dụ, như thế này:Lỗi "không tìm thấy" đối tượng "không tìm thấy" - điều đó có nghĩa là gì?

dt1 <- fread(" 
col1 col2 col3 
AAA ab cd 
BBB ef gh 
BBB ij kl 
CCC mn nm") 

Tôi đang làm cho bảng mới, ví dụ, như thế này:

dt1[, 
    .(col3, new=.N), 
    by=col1] 

> col1 col3 new 
>1: AAA cd 1 
>2: BBB gh 2 
>3: BBB kl 2 
>4: CCC op 1 

này hoạt động tốt khi tôi thấy tên cột một cách rõ ràng . Nhưng khi tôi có chúng trong các biến và cố gắng sử dụng with=F, điều này mang lại một lỗi:

colBy <- 'col1' 
colShow <- 'col3' 

dt1[, 
    .(colShow, 'new'=.N), 
    by=colBy, 
    with=F] 
# Error in `[.data.table`(dt1, , .(colShow, new = .N), by = colBy, with = F) : object 'ansvals' not found 

tôi không thể tìm thấy bất kỳ thông tin về lỗi này cho đến nay.

Trả lời

7

Lý do bạn nhận được thông báo lỗi này là khi sử dụng with=FALSE, bạn hãy cho biết data.table để xử lý j như thể đó là một khung dữ liệu. Do đó, nó mong đợi một vectơ của các tên cột và không phải là một biểu thức được đánh giá trong jnew=.N.

Từ các tài liệu của ?data.table về with:

By default with=TRUE and j is evaluated within the frame of x; column names can be used as variables. When with=FALSE j is a character vector of column names or a numeric vector of column positions to select, and the value returned is always a data.table.

Khi bạn sử dụng with=FALSE, bạn phải chọn COLUMNNAMES trong j mà không có một . trước () như thế này: dt1[, (colShow), with=FALSE]. Các tùy chọn khác là dt1[, c(colShow), with=FALSE] hoặc dt1[, colShow, with=FALSE]. Bạn có thể lấy kết quả tương tự bằng cách sử dụng dt1[, .(col3)]

Để tổng hợp: with = FALSE được sử dụng để chọn các cột theo cách data.frame. Vì vậy, bạn nên làm điều đó sau đó như vậy.

Cũng bằng cách sử dụng by = colBy bạn đang nói data.table để đánh giá j mà là ở sự mâu thuẫn với with = FALSE.

Từ các tài liệu của ?data.table về j:

A single column name, single expresson of column names, list() of expressions of column names, an expression or function call that evaluates to list (including data.frame and data.table which are lists, too), or (when with=FALSE) a vector of names or positions to select.

j is evaluated within the frame of the data.table; i.e., it sees column names as if they are variables. Use j=list(...) to return multiple columns and/or expressions of columns. A single column or single expression returns that type, usually a vector. See the examples.

Xem cũng chỉ 1.d and 1.g of the introduction vignette của data.table.


ansvals là một cái tên được sử dụng trong data.table internals. Bạn có thể nhìn thấy nơi nó xuất hiện trong các mã bằng cách sử dụng ctrl +f (Windows) hoặc cmd + f (MacOS) here.

+0

cảm ơn bạn đã giải thích! Liệu nó thực sự có nghĩa là không có cách nào để sử dụng 'by =' khi tên cột được lưu trữ trong các biến? –

+0

@VasilyA Điều đó chắc chắn có thể, nhưng bạn phải làm điều đó một cách chính xác. Xem [tại đây] (http://stackoverflow.com/questions/32940580/convert-some-column-classes-in-data-table/32942319#32942319) hoặc [tại đây] (http://stackoverflow.com/questions/ 33772830/how-to-set-multiple-columns-and-selected-rows-in-data-table-to-value-from-other/33774525 # 33774525) cho các ví dụ. Bạn cũng có thể muốn đọc [hướng dẫn bắt đầu] (https://github.com/Rdatatable/data.table/wiki/Getting-started) – Jaap

+0

tốt, trong các ví dụ đó 'by =' không được sử dụng, làm cho nó hoàn toàn khác ... Tôi sẽ đọc lại hướng dẫn Bắt đầu và có thể đăng một câu hỏi riêng để xác định chính xác những gì tôi cần. –

1

Lỗi object 'ansvals' not found trông giống như lỗi cho tôi. Nó phải là một thông điệp hữu ích hoặc chỉ hoạt động. Tôi đã gửi issue #1440 liên kết ngược lại câu hỏi này, cảm ơn bạn.

Jaap hoàn toàn chính xác.Theo sau câu trả lời của mình, bạn có thể sử dụng get() trong j như sau:

dt1 
# col1 col2 col3 
#1: AAA ab cd 
#2: BBB ef gh 
#3: BBB ij kl 
#4: CCC mn nm 
colBy 
#[1] "col1" 
colShow 
#[1] "col3" 
dt1[,.(get(colShow),.N),by=colBy] 
# col1 V1 N 
#1: AAA cd 1 
#2: BBB gh 2 
#3: BBB kl 2 
#4: CCC nm 1 
+1

cảm ơn Matt! Tôi chỉ định đăng câu hỏi nếu 'get()' có thể là một giải pháp tốt :) –

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