2013-10-23 18 views
21

numarasına kaçının. Çizmeden önce bir veri kümesi oluşturmaya çalışıyorum. Ben fonksiyon fabrika gammaplot.ff() kullanmaya karar ve benim kodunun ilk sürümü şuna benzer:Rbind()/cbind() dönüşümü nümerik değerden

PowerUtility1d <- function(x, delta = 4) { 
    return(((x+1)^(1 - delta))/(1 - delta)) 
} 
PowerUtility1d <- Vectorize(PowerUtility1d, "x") 

# function factory allows multiparametrization of PowerUtility1d() 
gammaplot.ff <- function(type, gamma) { 
    ff <- switch(type, 
       original = function(x) PowerUtility1d(x/10, gamma), 
       pnorm_wrong = function(x) PowerUtility1d(2*pnorm(x)-1, gamma), 
       pnorm_right = function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma) 
      ) 
    ff 
} 

gammaplot.df <- data.frame(type=numeric(), gamma=numeric(), 
          x=numeric(), y=numeric()) 
gammaplot.gamma <- c(1.1, 1.3, 1.5, 2:7) 
gammaplot.pts <- (-1e4:1e4)/1e3 

# building the data set 
for (gm in gammaplot.gamma) { 
    for (tp in c("original", "pnorm_wrong", "pnorm_right")) { 
    fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)  
    dataChunk <- cbind(tp, gm, gammaplot.pts, fpts) 
    colnames(dataChunk) <- names(gammaplot.df) 
    gammaplot.df <- rbind(gammaplot.df, dataChunk) 
    } 
} 

# rbind()/cbind() cast all data to character, but x and y are numeric 
gammaplot.df$x <- as.numeric(as.character(gammaplot.df$x)) 
gammaplot.df$y <- as.numeric(as.character(gammaplot.df$y)) 

bütün veri çerçevesi karakter verileri içeren, çıkıyor, bu yüzden elle geri dönüştürmek zorunda (biraz zaman aldı Bunu ilk etapta keşfet!). indicates SO arama bu tür türünde bir karakter olduğu için oluşur. Bu (! veri seti inşa ederken karakter verilerine performans sorunları tahmin edebilirsiniz) önlemek için ben kod biraz değişti:

gammaplot.ff <- function(type, gamma) { 
    ff <- switch(type, 
       function(x) PowerUtility1d(x/10, gamma), 
       function(x) PowerUtility1d(2*pnorm(x)-1, gamma), 
       function(x) PowerUtility1d(2*pnorm(x/3)-1, gamma) 
      ) 
    ff 
} 

for (gm in gammaplot.gamma) { 
    for (tp in 1:3) { 
    fpts <- gammaplot.ff(tp, gm)(gammaplot.pts)  
    dataChunk <- cbind(tp, gm, gammaplot.pts, fpts) 
    colnames(dataChunk) <- names(gammaplot.df) 
    gammaplot.df <- rbind(gammaplot.df, dataChunk) 
    } 
} 

Bu benim için çalışıyor, ama kendi kendini açıklayıcı bir karakter parametresi, kaybettiği bir dezavantaj. Tüm verilerin karaktere kapalı bir dönüşümü olmadan işlev fabrikasının ilk sürümünü tutmanın bir yolu var mı?

Aynı sonucu elde etmenin başka bir yolu varsa, bunu denemek isterim.

+0

@Thomas, kısa cevabınız açıkça yanlış; kabul edilen cevaba bakınız. Ayrıca, alternatifsiz bir şey yapmaman gerektiğini belirten yapıcı değildir. –

cevap

48

Sen rbind.data.frame ve cbind.data.frame yerine rbind ve cbind kullanabilirsiniz.

+0

Sadece "cbind.data.frame" işlevini kullanmak için yeterlidir, çünkü "rbind" düzgün çalışıyor (veri çerçevesini argümanlarından biri olarak algılıyor). Hiç bu kadar basit olacağını düşünmemiştim! – tonytonov

+2

Dikkat: 'cbind.data.frame()' isimlerini liste listeleriyle birlikte kullanırken, n x m matris oluşturacaksınız, niyetiniz yoktu. durumda, bu() 'yerine cbind' arasında 'cbind.data.frame kullanmadan önce, sadece' listelenmemesini() 'adlı listeyi tasarlanmamıştır()'. – BurninLeo

+6

bbind.data.frame (tp, gm, gammaplot.pts, fpts, dizeleriAsFactors = YANLIŞ) ' Dizeleri yoksaAsFactors = F hala faktörünüz olabilir. – mtelesha