2012-11-29 29 views
9

A data.table câu hỏi mới làm quen. Tôi muốn chuyển đổi một tập hợp các cột trong một data.table bằng cách áp dụng một công thức toán học cho chúng. Tập hợp các cột phải loại trừ 1 hoặc nhiều hơn tổng số cột.Chuyển đổi một tập hợp các cột trong một data.table

Trong data.frame về tôi sẽ làm:

data(iris) 
head(iris) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   5.1   3.5   1.4   0.2 setosa 
2   4.9   3.0   1.4   0.2 setosa 
3   4.7   3.2   1.3   0.2 setosa 
4   4.6   3.1   1.5   0.2 setosa 
5   5.0   3.6   1.4   0.2 setosa 
6   5.4   3.9   1.7   0.4 setosa 

iris[, -5] <- iris[, -5] * 1e3 
head(iris) 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1   5100  3500   1400   200 setosa 
2   4900  3000   1400   200 setosa 
3   4700  3200   1300   200 setosa 
4   4600  3100   1500   200 setosa 
5   5000  3600   1400   200 setosa 
6   5400  3900   1700   400 setosa 

tôi biết làm thế nào để chọn multiple columns trong một data.table:

iris.dt <- data.table(iris) 
head(iris.dt[, -5, with = FALSE]) 

hoặc thậm chí:

head(iris.dt[, !"Species", with = FALSE]) 

Làm thế nào để thực sự chuyển đổi những các cột được chọn đang tận dụng lợi thế của data.table pass-by-reference?

Trả lời

11

gì về việc sử dụng lập luận .SDCols cùng với nhiệm vụ bằng cách tham khảo (:=):

DT <- data.table(iris) 
DT[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width") 
    :=lapply(.SD, function(x) x*1000), .SDcols=1:4] 
# Alternatively you can grab the names the usual way: 
# DT[, names(DT)[1:4] := lapply(.SD, function(x) x*1000), .SDcols=1:4] 
DT 
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1:   5100  3500   1400   200 setosa 
# 2:   4900  3000   1400   200 setosa 
# 3:   4700  3200   1300   200 setosa 
# 4:   4600  3100   1500   200 setosa 
# 5:   5000  3600   1400   200 setosa 
# ---                
# 146:   6700  3000   5200  2300 virginica 
# 147:   6300  2500   5000  1900 virginica 
# 148:   6500  3000   5200  2000 virginica 
# 149:   6200  3400   5400  2300 virginica 
# 150:   5900  3000   5100  1800 virginica 
Các vấn đề liên quan