2012-11-29 13 views
9

A data.table Neuling Frage. Ich möchte eine Reihe von Spalten in einer data.table transformieren, indem Sie eine mathematische Formel auf sie anwenden. Der Satz von Spalten muss 1 oder mehr der Gesamtzahl der Spalten ausschließen.Transformieren Sie eine Reihe von Spalten in einer data.table

In data.frame Bedingungen würde ich tun:

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 

Ich weiß, wie multiple columns in einem data.table wählen:

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

oder sogar:

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

Wie zu verwandeln tatsächlich diejenigen ausgewählte Spalten unter Ausnutzung von data.table Pass-by-Referenz?

Antwort

11

Was ist das .SDCols Argument zusammen mit Zuordnung unter Verwendung von Referenz (:=):

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 
Verwandte Themen