2012-11-29 15 views
9

data.table नौसिखिया प्रश्न में कॉलम का एक सेट ट्रांसफॉर्म करें। मैं उन्हें गणितीय सूत्र लागू करके data.table में स्तंभों का एक सेट बदलना चाहता हूं। कॉलम के सेट को कॉलम की कुल संख्या में से 1 या अधिक को बाहर करना होगा।डेटाटेबल

data.frame संदर्भ में मुझे क्या करना होगा:

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 

मैं जानता हूँ कि एक data.table में multiple columns चयन करने के लिए कैसे:

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

या यहाँ तक कि:

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

कैसे वास्तव में उन को बदलने के लिएका लाभ उठाते हुए चयनित कॉलमपास-दर-संदर्भ?

उत्तर

11

क्या संदर्भ (:=) द्वारा काम के साथ-साथ .SDCols तर्क का उपयोग के बारे में:

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