2012-10-10 16 views
6

değiştirir, ben olağanüstü bir satır bulundu. split(x,g)'un bir listeyle sonuçlanmasını bekledim, ancak daha sonra atanmış ancak atılmış olabilir. Sorum şu: Neden x değeri değişiyor? Sadece a değiştiAtama <code>ave</code> işlevi aracılığıyla Looking değişken

a <- data.frame(id=c(1,1,2,2), value=c(4,5,7,6)) 
# id value 
# 1 1  4 
# 2 1  5 
# 3 2  7 
# 4 2  6 

split(a,a$id) # Split a row-wise by id into a list of size 2 
# $`1` 
# id value 
# 1 1  4 
# 2 1  5 
# $`2` 
# id value 
# 3 2  7 
# 4 2  6 

# Find the row with highest value for each id 
lapply(split(a,a$id),function(x) x[which.max(x$value),]) 
# $`1` 
# id value 
# 2 1  5 
# $`2` 
# id value 
# 3 2  7 

# Assigning to the split changes the data.frame a! 
split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),]) 
a 
# id value 
# 1 1  5 
# 2 1  5 
# 3 2  7 
# 4 2  7 

, ancak atama sağ tarafındaki gibi görünmüyor bir değere değişti:

Başka bir örnek daha iyi açıklayabilir! split(a,a$id)'a bir şekilde atama, bir şekilde a'u (anlamadığım) değiştirirse, neden list yerine data.frame sonuçlanır?

Bu görevi gerçekleştirmenin daha iyi yollarının olduğunu anladığımı unutmayın. Sorumaneden a değiştir?

+2

Aradığınız işlev "split <-", "split" değil. Onlar iki farklı fonksiyon. 'Böl <-.' Seçeneğine bakın ve 'a' nin neden değiştiğini anlıyoruz. –

+0

Ve işlevin adı bir işleç içerdiğinden, işlevi yazdırmak için arka alıntılar kullanmanız gerekir: '\' split <-. Default \ ''. –

+0

Bu durumda, ilgili işlev "\" split <-. Data.frame \ '' değil miydi? – nograpes

cevap

2

an için yardım sayfası onun başlığında yazdığı gibi split<- tanımını bakabilirsiniz: "yedek formları böyle bir bölünme karşılık gelen değerleri değiştirin. " Bu yüzden, yaygın olarak kullanılmadığını kabul etmeme rağmen, gerçekten beklenmedik olmamalıdır. Örneğinizin, atanan değerlerin "ödevin RHS'si gibi görünmediğini" nasıl gösterdiğini anlamıyorum. Maksimum değerler, ikinci argüman faktörü tarafından tanımlanan kategorilerdeki 'değer' listelerine atanır.

(Ben soru için teşekkür edebilirim. Ben split<-ave çekirdeğini olduğunu fark etmemişti. Ben ave harika kullanışlı fonksiyon olduğunu düşünüyorum çünkü, daha yaygın olarak kullanılan anladım daha sanırım.)

+0

Anladım. Benim meselem, 'bölünmüş <-' nin kendisinin bir işlev olduğunu anlamadım. Bu fonksiyonun çok akıllı, özlü ve etkili bir kod için kullanılabileceğinden şüpheleniyorum. Cevabınız için teşekkürler. – nograpes

+0

Tür: yöntemler (\ ayırmak <- \ ') –

1

Sadece a tanımı, split(a, a$id)=1 gerçekleştirildikten sonra, sonuç şöyle olacaktır:

> a 
    id value 
1 1  1 
2 1  1 
3 1  1 
4 1  1 
+1

'split', sonuçları referans olarak döndürmez. –

+0

@DWin Teşekkürler. Yanıtı düzelttim – Ali

0

Burada anahtar o bölünmüş < olduğunu - aslında RHS değerlerle LHS güncellenmiştir.

> x <- c(1,2,3); 
> split(x,x==2) 
$`FALSE` 
[1] 1 3 
$`TRUE` 
[1] 2 
> split(x,x==2) <- split(c(10,20,30),c(10,20,30)==20) 
> x 
[1] 10 20 30 

Not I split(x,x==2) <- yeniden atamak hattı:

İşte bir örnek. Bu aslında x yeniden atar. aşağıdaki yorum belirttiğimiz gibi

, bunu

> `split<-.default` 
function (x, f, drop = FALSE, ..., value) 
{ 
    ix <- split(seq_along(x), f, drop = drop, ...) 
    n <- length(value) 
    j <- 0 
    for (i in ix) { 
     j <- j%%n + 1 
     x[i] <- value[[j]] 
    } 
    x 
} 
<bytecode: 0x1e18ef8> 
<environment: namespace:base> 
+2

'split <-' aranıyor ve R yazılıyor. –

+0

Bunun için kodu nasıl görüntülersiniz.En azından bölünme için "split" yazabilirim ve çıktılar: işlevi (x, f, drop = FALSE, ...) UseMethod ("split") Arcymag

+0

Ve Joshua, _does_ dönüş değerleri bölünmüş (RHS) ne yazdığını eklemek ve referans ile geçmez. –