Verilerde birden fazla sütun seçin. Sayısal dizinlerine göre


143

Sayısal indekslerinin (konumunun) bir vektörünü kullanarak birden çok sütunu nasıl seçebiliriz data.table?

Biz şu şekilde yapacağız data.frame:

df <- data.frame(a = 1, b = 2, c = 3)
df[ , 2:3]
#   b c
# 1 2 3

Yanıtlar:


185

Data.table sürümleri >= 1.9.8için aşağıdakilerin hepsi işe yarar :

library(data.table)
dt <- data.table(a = 1, b = 2, c = 3)

# select single column by index
dt[, 2]
#    b
# 1: 2

# select multiple columns by index
dt[, 2:3]
#    b c
# 1: 2 3

# select single column by name
dt[, "a"]
#    a
# 1: 1

# select multiple columns by name
dt[, c("a", "b")]
#    a b
# 1: 1 2

Data.table sürümleri < 1.9.8için (sayısal sütun seçiminin kullanılması gerekir with = FALSE), bu cevabın önceki sürümüne bakın . Ayrıca bkz . V1.9.8'deki HABERLER , POTANSİYEL KIRICI DEĞİŞİKLİKLER, nokta 3.


1
Sorun değil. Ayrıca karşılaştırın dt[,"a"]ve dt[,"a", with=FALSE]gerçekten ne kadar yararlı bir seçenek olduğunu görmek için.
Josh O'Brien

3
olmadan bunu yapmanın herhangi bir yolu var mı? örneğin DT[,list(b:c), sütunları doğrudan veri tablosunda dönüştürmeyi uygun bulduğum için, örneğin yapabilirim DT[,list(1/b,2*c)], ancak bu ile çalışmaz.
jamborta

2
with=FALSEBu durumda pakette bir değişiklik yapmak gereksiz olacaktır : github.com/Rdatatable/data.table/issues/…
Frank

1
@Frank - Bu harika bir haber! Dikkatime sunduğunuz için teşekkürler. Bu değişiklik CRAN'da dağıtılan data.table sürümüne girdiğinde , değişikliği en üstte duyurmak için bu cevabı düzenleyeceğim. (Ve lütfen - siz veya bunu okuyan herhangi biri - en kısa sürede bana bir hatırlatma ile ping göndermekten çekinmeyin.)
Josh O'Brien

2
@Valentas Komik sormalısın. Kullanmanın data.frameuyumlu bir yolu yoktur with=FALSE. Ancak, 3 hakkında hafta önce itibariyle gelişimi versiyonu data.table gibi çağrılara değiştirildi dt[, 2], dt[, 2:3], dt[, "b"], ve dt[, c("b", "c")]onlar ile olduğu gibi aynı davranırlar data.frames olmadan açıkça ayarlamak zorunda with=FALSE. O müthiş! Değişikliği açıklayan HABER girişi de dahil olmak üzere ilgili taahhüt için buraya bakın .
Josh O'Brien

43

Biraz ayrıntılı, ama gizli .SDdeğişkeni kullanmaya alıştım .

b<-data.table(a=1,b=2,c=3,d=4)
b[,.SD,.SDcols=c(1:2)]

Biraz güçlük çekiyor, ancak diğer verilerde kaybolmuyorsunuz. Tablo özelliklerini (sanmıyorum), bu yüzden yine de birleştirme tabloları gibi diğer önemli işlevleri kullanabilmelisiniz.


6
Programlı olarak sütun listesi oluştururken bir güçlük ve çok yararlı
Chris

39

Eğer sütun kullanmak istiyorsanız isimleri sütunları seçmek için, sadece kullanım .()için bir takma olan list():

library(data.table)
dt <- data.table(a = 1:2, b = 2:3, c = 3:4)
dt[ , .(b, c)] # select the columns b and c
# Result:
#    b c
# 1: 2 3
# 2: 3 4

19

V1.10.2'den itibaren, ..

dt <- data.table(a=1:2, b=2:3, c=3:4)

keep_cols = c("a", "c")

dt[, ..keep_cols]

3
Bu cevap için teşekkürler. Ben de buldum dt[, !..keep_cols]ve dt[, -..keep_cols] beklendiği gibi çalışıyor!
IceCreamToucan

3

@Tom, bu çözümü gösterdiğin için çok teşekkür ederim. Benim için harika çalışıyor.

Sadece bir sütunu baskıdan ve yukarıdaki örnekten hariç tutmanın bir yolunu arıyordum. İkinci sütunu hariç tutmak için böyle bir şey yapabilirsiniz

library(data.table)
dt <- data.table(a=1:2, b=2:3, c=3:4)
dt[,.SD,.SDcols=-2]
dt[,.SD,.SDcols=c(1,3)]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.