2016-03-21 29 views
1

'daki bir değerler temelinde data.table nasıl alt kümeye alınabilir? Veri.table'da, bir tablonun sayısal sayı vektörünün temelinde bir alt gruba ayırmanın bir yolu, with=FALSE kullanımını içerir.Belirli bir sütun numarası

şöyle ben satır miting bir kriter arayan sütun numaralarının sayısal vektör temelinde bir data.table döngü çalışıyorum: Benim durumda

require(data.table) 

ab=data.table(id=c("geneA", "geneB", "geneC", "geneA", "geneA", "geneB", "", "NA"), 
       co1=c(1,2,3,0,7), co2=c(0,0,4,5,6), nontarget=c(9,0,7,6,5), 
       co3=c(0,1,2,3,4)) 
target_col_nums=grep('co', colnames(ab)) 

##Data.table doesn't treat colnames(ab)[i] as one of the 
## column name variables, and with=F only seems to work for j in dt[i,j,by] 
for (i in target_col_nums){ 
    print(ab[colnames(ab)[i]>3]) 
} 

##This produces the desired output 
ab[co1>3] 
ab[co2>3] 
ab[co3>3] 

, benim asıl masam oldukça büyük, dolayısıyla colnamesleri kendim kullanamıyorum.

Umarım bu, topluluğa yararlı bir sorudur.

+1

Örnek verilerinizin uyarı ürettiğinin farkında mısınız? – SymbolixAU

+1

"Gerçek tablom oldukça geniştir, bu yüzden colnamesleri kendim kullanamıyorum." Bu bana mantıklı gelmiyor. Sütun adlarınız anlamsızsa, devam edin ve bunun yerine bir matris kullanın, aksi halde, sayıya atıfta bulunmak yerine bir dize/karakter vektörüne dahil olduklarını düşünüyorum. Burada, bu genellikle https://rawgit.com/wiki/Rdatatable/data.table/vignettes/datatable-faq.html#j-num – Frank

cevap

3

Sen bir ifadenin

for (i in target_col_nums){ 
    expr <- paste0(colnames(ab)[i], ">3") 
    print(ab[eval(parse(text = expr)), ]) 
} 

#  id co1 co2 nontarget co3 
#1: geneA 7 6   5 4 
#  id co1 co2 nontarget co3 
#1: geneC 3 4   7 2 
#2: geneA 0 5   6 3 
#3: geneA 7 6   5 4 
#4: NA 3 4   7 2 
#  id co1 co2 nontarget co3 
#1: geneA 7 6   5 4 

olarak sütun (eval) değerlendirebilirsiniz Yoksa söz konusu passing variables as data.table column names

+1

niçin tavsiye edildiği için buraya bir göz atın. text = paste0 ("print (ab [", names (ab) [target_col_nums], "> 3])")). O zaman sadece yapamazsın (expr, eval). ' – MichaelChirico

1

Biz belirtebilirsiniz önerilerden hiçbirini deneyebilirsiniz 'i' .SDcols ve kullanma Satırları ayarlamak için kullanılabilecek mantıksal bir vektör almak için .SD numaralı koşulu kullanın.

for(i in target_col_nums){ 
print(ab[ab[, .SD[[1L]] >3, .SDcols = i]]) 
} 
#   id co1 co2 nontarget co3 
#1: geneA 7 6   5 4 
#  id co1 co2 nontarget co3 
#1: geneC 3 4   7 2 
#2: geneA 0 5   6 3 
#3: geneA 7 6   5 4 
#4: NA 3 4   7 2 
#  id co1 co2 nontarget co3 
#1: geneA 7 6   5 4 
2
Kişisel yaklaşım çok az ve hala (programlama yoluyla numaraları var çünkü bu durumda o kadar zararlı olmasa da, kötü uygulamalar, hangi genellikle) sütunu numaralarını kullanarak etrafında almak ayarlanabilir

:

target_cols = names(ab)[grepl("co", names(ab))] 

sapply(target_cols, function(jj) print(ab[get(jj) > 3])) 

'daki sarki NULL girdisi bir dikkat dağıtıcıysa/aksi takdirde sizi rahatsız eder.

4
for (col in grep('co', names(ab), value = T)) 
    print(ab[get(col) > 3]) 
#  id co1 co2 nontarget co3 
#1: geneA 7 6   5 4 
#  id co1 co2 nontarget co3 
#1: geneC 3 4   7 2 
#2: geneA 0 5   6 3 
#3: geneA 7 6   5 4 
#4: NA 3 4   7 2 
#  id co1 co2 nontarget co3 
#1: geneA 7 6   5 4 
+1

temel olarak benim snazzier versiyonum! 'value' argümanının büyük örneklemesi – MichaelChirico

İlgili konular