2015-08-04 20 views
5

İlk sütunu kategorik bir tanımlayıcı olarak, ikinci sütunu bir frekans değeri olarak ve kalan sütunları ham veri sayıları olarak içeren veri çerçevem ​​var. Tüm sütunları frekans sütunuyla çarpmak istiyorum ama ilk ikisini değil.muply_each işlevini kullanırken belirli sütunları seçerek dplyr

Tüm ham sayım sütunları Cihazı nokta, örneğin "L.abd", T.xyz vs. ardından büyük harfle başlar Örneğin

, kodu kullanırsanız:

require(dplyr) 
    ID <- c(1,2,3,4,5,6) 
    Freq <- c(0.1,0.2,0.3,0.5,0.1,0.3) 
    L.abc <- c(1,1,1,3,1,0) 
    L.ABC <- c(0,3,2,4,1,1) 
    T.xyz <- c(1,1,1,1,0,1) 
    F.ABC <- c(4,5,6,5,3,1) 

    df <- as.data.frame(cbind(ID, Freq, L.abc, L.ABC, T.xyz, F.ABC)) 

    df_new <- df %>% mutate_each(funs(.*Freq), starts_with("L."))   

"L." ile başlayan sütunlarla birlikte kategorik veri sütunlarını içeren yeni bir veri çerçevesi oluşturabilirim karşılık gelen frekans değeri ile çarpılmıştır.

"begin_with" komutunu büyük harfle başlayan ve tam durmaya başlayan tüm sütunları seçmek için değiştirmenin bir yolu var mı? "[A-Z]" gibi modifikasyonları kullanmaya başlama girişimlerim. başarısız oldu. Bu gibi durumlar için önceden

cevap

7

yılında

sayesinde matches Sana büyük harfle başlar select sadece sütun adları istediğini varsayıyorum,

df %>% 
     mutate_each(funs(.*Freq), matches("^[A-Z]\\.", ignore.case=FALSE)) 

Burada daha uygun olur (^[A-Z]) izledi . tarafından. .'dan (\\.) kaçmalıyız, aksi halde tek bir karakter olarak kabul edilecektir.

starts_with bölümündeki hiçbir şeyi değiştirmiyorum. mutate_each'da bir işlevi iletmemiz gerekirse, bir funs çağrısının içinden geçirilebilir. Yukarıdaki kodda, matches tarafından seçilen sütunların (.) 'Freq' sütunuyla çarpıyoruz. ?select

karşılaşması (x, ignore.case = TRUE) 'göre

: eklendi @docendodiscimus: olan adı normal ifade 'x'

düzenleyerek, bütün değişkenler seçer yorum

+2

Sen 'maçları ("^[AZ] \\", ignore.case = FALSE) kullanmak isteyebilirsiniz' Varsayılan olarak DOĞRU ve OP, büyük harflerle yazmak istiyor. Örnekle karşılaştırın (select, iris, eşlemeler ("^ [az]. *")) 'Ve' seçin (iris, eşleşmeler ("^ [az]. *", Ignore.case = FALSE)) ' –

+0

@docendodiscimus Thanks varsayılan durumu kontrol etmedi. – akrun

2

Sadece diğer kullanıcılardan gelen a related question yanıtladım, mutate_eachmutate_at lehine kabul edilmeyecektir. Senin durumunda

eşdeğer kodudur:

df %>% mutate_at(.cols=vars(matches("^[A-Z]\\.", ignore.case=FALSE)), .funs=funs(.*Freq))

ID Freq L.abc L.ABC T.xyz F.ABC 1 1 0.1 0.1 0.0 0.1 0.4 2 2 0.2 0.2 0.6 0.2 1.0 3 3 0.3 0.3 0.6 0.3 1.8 4 4 0.5 1.5 2.0 0.5 2.5 5 5 0.1 0.1 0.1 0.0 0.3 6 6 0.3 0.0 0.3 0.3 0.3