2016-04-04 25 views
0

data.table numaralı bir sütunu, aynı data.table numaralı başka bir sütunun değerleri aracılığıyla çalıştırarak düzenlemeye çalışıyorum. Ancak, bunu yaptığımda, aşağıdaki hatayı alıyorum: Error in eval(expr, envir, enclos) : object 'y' not found. Aşağıda, bunun kendi kodumda gerçekleştiği basit bir durum yaptım. Sadece DT[,y], hatta DT[,y[7]] yazabilirsiniz olarakHatada hata (expr, envir, muhafaza): nesne bulunamadı

n = c(2, 3, 5) 
s = c("aa", "bb", "cc", "dd", "ee") 
b = c(TRUE, FALSE, TRUE, FALSE, FALSE) 
x = list(n, s, b, 3, c(n,s), b, 5) 

DT <- data.table(grp=c("a","a","b","b","b","c","c"), foo=1:7, bar=x, y=rep("", length(x))) 

for (i in 1:nrow(DT)) { 
    if (DT[grp[i]=="a"]) { 
    DT[,y[i]:= c(x[[i]], x[[5]][i]] 
    } 
} 

Ancak açıkça y, bulunmaktadır. Bu neden oluyor?

DÜZENLEME: Gerçek kod, buradaki örneklerden biraz daha karmaşıktır; for döngüsü kullanarak sıkışmış hissediyorum nedeni, if deyiminin sonucuna dayanarak, x[i+n] değerleri boyunca çalıştırmak için while ifadesini kullanıyorum, tüm x[i] değerini y[i] durma koşulu karşılanana kadar ekleyin. Böylece yinelemeli elementin önemli olduğunu hissediyorum. Eğer data.table bütün y sütununun yerini isterseniz y sütunun bir alt kümesini değiştirmek istiyorsanız,

DT[ , y:= x ] 

kullanmak

+3

Bunu mu demek istediniz: 'DT [, y: = x]'? – andrechalom

+0

Ahh, kesinlikle çok basit olan önceki örnek için kesinlikle haklıydın. Bunu gerçek problemin biraz daha temsilcisiyim. – mlinegar

+2

(bunun neden çalışmadığına dair daha fazla neden var, ancak esas olarak) 'y [i] 'diye adlandırılan sütun yok; atomik olarak düşünüyorsunuz ve – eddi

cevap

3

, ilk "yuvaya" nin de alt kümesini belirtmek [] operatörü:

DT[ i, y := x ] 

Bu,

DT[ grp=="a", y := bar ] 
olarak, mantıksal testler yapılabilir

Bu, tam olarak sorunuzu yeniden üretmeyecek, ancak buradan uyarlamanın kolay olduğuna inanıyorum. Değilse, lütfen bir yorum bırakın. yerine döngünün alt kümesini kullanarak

çok daha iyi bir performansa sahiptir, ve çok daha deyimsel R.

içindir

Düzenleme: Örneklerde, kullanım durumları ve farklılıkları arasında bir LOT görebilirsiniz: = ve [ < - man sayfa için deyim ?`:=`

+0

DÜZENLEME: yanıtladığım yorum silindi. Her ne kadar OP, kullanılan verilerin gerçekte ne anlama geldiğine dair bazı ayrıntılar vermiş olsaydı daha iyi olurdu. Ancak, ilk yuvaya [,] 'de alt-dizilim ve ikincideki sütunun değiştirilmesi ile ilgili genel fikir, bir for döngüsünü kullanmaktan ve bir koşulu kontrol etmekten kesinlikle daha iyidir. – andrechalom

+1

Kodumu alt dizgeyi kullanmaya adapte etmeye çalışıyorum, ancak for döngüsünün karmaşıklığı göz önüne alındığında - bunu biraz daha iyi detaylandırmanın üzerine yeni bir yorum ekledim - eğer kullanmaya devam etmek mümkün olsaydı gerçekten çok güzel olurdu Döngü, en azından şimdilik. 'X' ile koşmak, kesinlikle çok daha yavaş olsa da, alt-kümeleme, x [i + n] ek gözlemlerini yakalamak ve hepsini "y [i]" ye koymak için daha iyi bir seçenek gibi görünmektedir. Sorunun çerçevesini değiştirmeye çok üzüldüm, yardımlarınız ve sabrınız için çok teşekkür ederim. – mlinegar

+0

Hm. * * For 'döngüsünü ve' DT [i, y: = etc] 'işlevini kullanabilirsiniz, ancak kod daha karmaşık hale gelecektir. Performans bir sorun değilse, data.frame 'e geri dönebilir ve sadece' DT [i, j] <- istediğinizi kullanabilirsiniz. Performans bir sorunsa, bu kodu C++ uygulamasında uygulamak ve Rcpp – andrechalom

İlgili konular