2016-03-23 30 views
1

İşlevlerimde dplyr işlevlerini koymakla gerçekten uğraşıyorum. Standart değerlendirme sürümleri için function_ son ekini anlıyorum, ancak yine de sorun yaşıyorum ve görünüşte tüm evalpaste ve lazy kombinasyonlarını denedim. Bir grup için denetimin medyanına birden fazla sütun ayırmaya çalışılıyor. Örnek veriler iris'te 'Kontrol' adlı bir ek sütun içerir, bu nedenle her türün 40 'normal' ve 10 'kontrolü' vardır.mutate_each_ standart dışı değerlendirme

data(iris) 
control <- rep(c(rep("normal", 40), rep("control", 10)), 3) 
iris$Control <- control 

Normal dplyr çalışıyor:

norm_iris <- function(df, control_col, control_val, species, num_cols = 1:4){ 

out <- df %>% 
    group_by_(species) %>% 
    mutate_each_(funs(./median(.[control_col == control])), num_cols) 
    return(out) 
} 

norm_iris(iris, control_col = "Control", control_val = "control", species = "Species") 

hata alıyorum::

Error in UseMethod("as.lazy_dots") : 
no applicable method for 'as.lazy_dots' applied to an object of class "c('integer', 'numeric')" 

yerine funs_ kullanma

out_df <- iris %>% 
    group_by(Species) %>% 
    mutate_each(funs(./median(.[Control == "control"])), 1:4) 

bir fonksiyonu içine bu kadar tamamlamayı çalışılıyor funsError:...: need numeric data Alıyorum

cevap

1

Henüz yapmadıysanız, standart değerlendirme here'daki skeçleri okumanıza yardımcı olabilir.

İşleviniz mutate_each_ doğrultusunda paketin den interp kullanımını lazyeval eksik. funs'da bir değişken adı (Control değişken) kullanmaya çalıştığınız için, interp ile birlikte bu durumda funs_ gerekir. Bu, hiç bir zaman mutate_each_'a ihtiyacınız olmayan bir durum olduğuna dikkat edin. Değiştirmek istediğiniz sütunları seçerken sütun numaraları yerine sütun adlarını kullanmaya çalışıyorsanız buna ihtiyacınız olacaktır. İşte

hat yerine ne var Fonksiyonunuzda gibi görünür budur:

mutate_each(funs_(interp(~./median(.[x == control_val]), x = as.name(control_col))), 
         num_cols) 
İlgili konular