2013-08-30 28 views
11

Tôi gặp sự cố không mong muốn khi cố gắng chuyển đổi nhiều cột của bảng dữ liệu thành các cột yếu tố. Tôi đã sao chép nó như sau:Chuyển đổi nhiều cột data.table thành các yếu tố trong R

library(data.table) 
tst <- data.table('a' = c('b','b','c','c')) 
class(tst[,a]) 
tst[,as.factor(a)] #Returns expected result 
tst[,as.factor('a'),with=FALSE] #Returns error 

Lệnh sau trả về 'Lỗi trong Math.factor (j): abs không có ý nghĩa cho các yếu tố'. Tôi tìm thấy điều này khi cố gắng để có được tst [, lapply (cols, as.factor), với = FALSE] trong đó cols là tập hợp các hàng tôi đã cố chuyển đổi thành các thừa số. Có giải pháp hay giải pháp nào cho việc này không?

+3

+1 Tôi đã thêm: [Gracefully catch internal abs() error on j khi with = FALSE nhưng j là yếu tố sai] (https://r-forge.r-project.org/tracker/index.php ? func = detail & aid = 4867 & group_id = 240 & atid = 978) –

Trả lời

23

Tôi tìm thấy một giải pháp:

library(data.table) 
tst <- data.table('a' = c('b','b','c','c')) 
class(tst[,a]) 
cols <- 'a' 
tst[,(cols):=lapply(.SD, as.factor),.SDcols=cols] 

Tuy nhiên, hành vi trước đó nói dường như lỗi.

+0

Bạn đang cố gắng lập chỉ mục data.table với một yếu tố - các yếu tố không phải là ký tự hay số học (chúng là các giá trị phân loại không có độ lớn rõ ràng), do đó data.table khống chế lỗi. – thelatemail

+1

Ngoài ra 'tst [, as.factor (a)]' chỉ trả về 'as.factor (tst $ a)' và không lập chỉ mục data.table. Hãy thử 'tst [, 1: 5]' để xem ý tôi là gì. – thelatemail

+1

bạn có thể thử 'tst [, a: = as.factor (a)]' nếu bạn chỉ có một cột hoặc làm những gì bạn đã hiển thị hoặc cũng sử dụng 'set' trong vòng lặp cho mỗi cột. – Arun

2

Điều này hiện được khắc phục trong v1.8.11, nhưng có thể không theo cách bạn mong muốn cho. Từ NEWS:

FR # 4867 hiện đã được triển khai. DT[, as.factor('x'), with=FALSE] trong đó x là một cột trong số DT, hiện tương đương với DT[, "x", with=FALSE] thay vì kết thúc bằng một lỗi. Nhờ tresbot báo cáo về SO: Converting multiple data.table columns to factors in R


Một số giải thích: Sự khác biệt, khi with=FALSE được sử dụng, đó là các cột của data.table không được coi là biến nữa. Đó là:

tst[, as.factor(a), with=FALSE] # would give "a" not found! 

sẽ dẫn đến lỗi "a" not found. Nhưng những gì bạn làm thay thế là:

tst[, as.factor('a'), with=FALSE] 

Bạn đang trên thực tế tạo ra một yếu tố "a" với level="a" và yêu cầu để tập con rằng cột. Điều này không thực sự có ý nghĩa nhiều. Lấy trường hợp của data.frame s:

DF <- data.frame(x=1:5, y=6:10) 
DF[, c("x", "y")] # gives back DF 

DF[, factor(c("x", "y"))] # gives back DF again, not factor columns 
DF[, factor(c("x", "x"))] # gives back two columns of "x", still integer, not factor! 

Vì vậy, về cơ bản, những gì bạn đang áp dụng một yếu tố trên, khi bạn sử dụng with=FALSEkhông trên các yếu tố của cột đó, nhưng chỉ là tên cột ... Tôi hy vọng tôi đã truyền đạt được sự khác biệt tốt. Vui lòng chỉnh sửa/nhận xét nếu có bất kỳ nhầm lẫn nào.

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