2013-04-25 21 views
6

Tôi muốn thay đổi lớp biến được chọn trong bảng dữ liệu, sử dụng thao tác được vector. Tôi mới vào cú pháp data.table, và đang cố gắng tìm hiểu càng nhiều càng tốt. Tôi bây giờ câu hỏi là cơ bản, nhưng nó sẽ giúp tôi hiểu rõ hơn cách suy nghĩ của bảng dữ liệu!Phân loại lại các cột được chọn trong Bảng dữ liệu

Câu hỏi tương tự đã được hỏi here! Tuy nhiên, giải pháp dường như liên quan đến việc phân loại lại chỉ một cột hoặc tất cả các cột. Câu hỏi của tôi là duy nhất cho một vài cột được chọn.

### Load package 
require(data.table) 

### Create pseudo data 
data <- data.table(id  = 1:10, 
        height = rnorm(10, mean = 182, sd = 20), 
        weight = rnorm(10, mean = 160, sd = 10), 
        color = rep(c('blue', 'gold'), times = 5)) 

### Reclass all columns 
data <- data[, lapply(.SD, as.character)] 

### Search for columns to be reclassed 
index <- grep('(id)|(height)|(weight)', names(data)) 

### data frame method 
df <- data.frame(data) 
df[, index] <- lapply(df[, index], as.numeric) 

### Failed attempt to reclass columns used the data.table method 
data <- data[, lapply(index, as.character), with = F] 

Mọi trợ giúp sẽ được đánh giá cao. Dữ liệu của tôi lớn và do đó, sử dụng cụm từ thông dụng để tạo vectơ các số cột để phân loại lại là cần thiết.

Cảm ơn bạn đã dành thời gian.

Trả lời

8

Tôi nghĩ rằng @ SimonO101 đã hầu hết các công việc

data[, names(data)[index] := lapply(.SD, as.character) , .SDcols = index ] 

Bạn có thể chỉ cần sử dụng := diệu

+0

+1 đó là nó !! Ok, kể từ khi câu trả lời của tôi là không chính xác tôi sẽ xóa nó. –

+0

Không, tôi đã học được mẹo đó ('.SDCols') với bạn ... – dickoa

+2

(+1) bạn có thể trực tiếp truyền' chỉ mục'. 'data [, c (index): = lapply (.SD, as.character), .SDcols = index]' – Arun

4

Bạn chỉ cần sử dụng .SDcols với vector chỉ mục của mình (Tôi đã học được điều đó ngay hôm nay!), Nhưng điều đó sẽ chỉ trả về bảng dữ liệu với các cột được phân loại lại. Câu trả lời của @dickoa là những gì bạn đang tìm kiếm.

data <- data[, lapply(.SD, as.character) , .SDcols = index ] 
sapply(data , class) 
     id  height  weight 
"character" "character" "character" 
+0

Điều này tạo ra bảng dữ liệu mới chỉ với cột "chỉ mục". Làm thế nào tôi có thể thay đổi lớp của cột "chỉ mục" và giữ phần còn lại của dữ liệu. Tôi có thể dễ dàng nhìn thấy cách làm điều này bằng cách sử dụng một hợp nhất hoặc cbind, nhưng đã có được một cách thanh lịch hơn! – Andreas

+0

Argggh. Bạn đúng rồi. Tôi biết điều này, nhưng tôi cũng gặp rắc rối với cú pháp. Có một cách dễ dàng - cố nhớ cú pháp chính xác !! –

+0

Điều quan trọng cần lưu ý. Cảm ơn bạn đã chỉnh sửa phản hồi của bạn để phản ánh những gì chúng tôi đã học! – Andreas

9

Bạn có thể tránh được những chi phí của việc xây dựng các .SD trong j bằng cách sử dụng set

for(j in index) set(data, j =j ,value = as.character(data[[j]])) 
+2

(+1) Điều này là nhanh/hiệu quả trên 2 tài khoản: 1) không có .SD và 2) bằng cách sử dụng 'set' thay vì': = '(cái thứ hai trong đó có' [.data.table' overhead). Rực rỡ! – Arun

+2

@Arun, nó thậm chí sẽ hoạt động trên data.frames! – mnel

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