2016-03-23 41 views
1

Bu başlık kafa karıştırıcı olsaydı özür dilerim, ancak bu sorunun nasıl söyleneceğini tam olarak anlayamıyorum, bu yüzden bulamıyorum. doğru işlev. Ben articles vektör karşılık gelen indeksi ile DF $ x tüm değerleri değiştirmek istiyorR: bir veri çerçevesindeki değerleri eşleşen bir vektörün dizinleriyle değiştirin

articles <- c(237, 278, 354, 600) 
ind <- seq(1, length(articles)) 
DF <- data.frame(x=c(237, 237, 278, 278, 278, 354, 600, 600, 600), 
      y=rnorm(9)) 

:

Temelde, bu derler. olduğu gibi, ben 2 vb olmayı 1 ve 278 olmak 237 istiyorum

Ben döngü için yerleşik yapar, ama benim gerçek data.frame çok daha büyüktür ve daha olmalı gibi hissediyorum Bunu başarmanın etkili yolu.

for (i in 1:length(articles)) { 
    DF[DF$x==articles[i], 1] <- ind[i] 
} 

Ben replace işlevi baktım ama bunu yapmak için görünmüyor: Eğer istediğim her sonuç görebilirsiniz böylece İşte benim için döngü vardır. Ayrıca, gerçekte, bu bir data.frame değil, bir data.table ({data.table} paketinden) 'dir. Açıkçası bunu gerekirse bir data.frame'e dönüştürebilirim, ancak eğer data.table paketinde bunu yapmak için daha verimli bir yol varsa harika olurdu.

Çok teşekkürler. Seth

+0

Eğer bir data.table ise, o zaman 'DF [, ind: = eşleşme (x, articles)]' veya daha fazla 'artDT = data.table (x = items) [, idx: = .I] ; DF [artDT, idx: = i.idx, on = "x"] ' – Frank

cevap

1

yapardım:

articles <- c(237, 278, 354, 600) 
DF <- data.frame(x=c(237, 237, 278, 278, 278, 354, 600, 600, 600), 
     y=rnorm(9)) 
DF$x <- match(DF$x, articles) 

bu durumda ind Eğer maçı ile almak sadece değerdir Çünkü

.

+0

Bu, gerçekten harika çalışıyor. Teşekkürler. – seth127

+0

Aslında, bunu kabul edilen yanıtla değiştirdim çünkü biraz daha hızlı. Her iki seçenek de iyi çalışıyor. Herkese tekrar teşekkürler! – seth127

2

Sen deneyebilirsiniz:

DF$x <- as.numeric(as.factor(DF$x)) 
DF 
    x   y 
1 1 0.10610802 
2 1 1.71933883 
3 2 0.01788855 
4 2 0.83659415 
5 2 0.43162867 
6 3 0.68937628 
7 4 -1.47557905 
8 4 -0.24103146 
9 4 0.14286818 
+0

Bu harika. Teşekkürler! – seth127

İlgili konular