2016-04-01 18 views
0

'daki diğer sütunlardaki değere dayalı etkili ölçeklendirme sütunu yolu Başka bir sütundaki değerlere dayanarak dataframe sütunundaki değerleri ölçeklemek istiyorum.R dataframe

I y değerlerine dayalı x değerlerini ölçeklemek isteyen
  x y 
1 1.0895865 2 
2 0.8261554 2 
3 5.3503761 2 
4 3.3940759 1 
5 6.2786637 1 

, yani ne istediğim sahip olmaktır: Örneğin, burada çıkış basit bir örnek

d<-data.frame(x=runif(5,0,10),y=sample(c(1,2),size=5,replace=TRUE)) 

verir ise

sonra x değerlerini, d xy=2 ile ölçeklenen değerler ile değiştirin. Şimdiye kadar ne yaptım

olan aksak biraz:

 d1<-subset(d,y==1) 
d2<-subset(d,y==2) 

d1$x<-(d1$x-mean(d1$x))/sd(d1$x) 
d2$x<-(d2$x-mean(d2$x))/sd(d2$x) 

ve sonra büyük bir veri çerçevesi tüm sonuçları bağlayıcı, ama benim gerçek veri y için 50 farklı değerlere sahip olduğu için bu biraz sıkıcı ve bunu birden çok (farklı) sütun için yapmak istiyorum.

require(dplyr) 
d %>% 
    group_by(y) %>% 
    mutate(x = (x - mean(x))/sd(x)) 
+1

Tekrar üretilebilir hale getirmek ve beklenen çıktıyı paylaşmak için lütfen 'set.seed() 'kodunu ekleyin. – mtoto

+0

Belki de ave (d $ x, d $ y, FUN = işlev (x) (x-ortalama (x))/sd (x)) 'yi arıyoruz. – nicola

cevap

2

Kolayca dplyr paketinden group_by ve mutate kullanarak bunu yapabilirsiniz. 'Data.frame' dosyasını 'b' ile gruplandırılmış 'data.table' (setDT(d)) 'a, ' x 'ile' x2 'arasında scale atayız.

setDT(d)[, x2 := scale(x) , by = y] 
+0

'%>%' ifadesini açıklayabilir misiniz, neden biçimi normal bir işlevden çok farklı? Bu harika btw çalışıyor! – dimebucker91

+1

'%>%', "magrittr" öğesinden zincirleme operatörüdür. Birkaç işlevi bir araya getirerek daha kolay ve daha okunabilir hale getirir. Yukarıdaki kodu '%>%' olmadan yazdığınızda, 'mutasyona (group_by (d, y), x = (x - ortalama (x))/sd (x)) 'olur. Temelde 'f (x, y)' yazıp yazmak yerine 'x%>% f (y)' yazabilirsiniz. Daha fazla bilgi için [buraya] (https://github.com/smbache/magrittr) adresini de kontrol edin. – shadow

1

Bu görev dplyr genellikle performy group by gereğidir ve biz data.table kullanabilirsiniz scale

library(dplyr) 
d %>% group_by(y) %>% mutate(x2=scale(x)) 
0

kullanarak:

+0

Bu, soruya bir cevap vermemektedir. Bir yazardan eleştiri yapmak veya açıklama istemek için yazılarının altında bir yorum bırakın. - [Yorum Yaz] (/ review/düşük kaliteli yazılar/11857424) –

+0

@AlessandroCuttin Açıklama eklendi. – akrun