2012-01-04 18 views
14

Sanırım veri çerçeveleri oluşturan bir işlev var. Ben aşağıda, farklı giriş değerleri ile bu işlevi çalıştırmak ve sonra büyük bir veri çerçevesi içine sonuçları birlikte rbind istiyorum:Bir liste döndürmek için haritaya zorla katıl?

CreateDataFrame <- function(type="A", n=10, n.true=8) { 
    data.frame(success=c(rep(TRUE, n.true), rep(FALSE, n - n.true)), type=type) 
} 
df <- do.call(rbind, lapply(toupper(letters[1:5]), CreateDataFrame)) 

Benim CreateDataFrame fonksiyonu üç argüman alır. Yukarıdaki örnekte, ikinci ve üçüncü argümanlar sabit tutulur. Aynı şeyi yukarıdaki gibi yapmak isterim, ancak her çağrıda ikinci ve üçüncü argümanları değiştiririm. Ben bu gibi mapply kullanmak zorunda düşünüyorum: mapply do.call(rbind, mapply(...)) çalışmasını beni engelleyen bir liste, dönen olmadığı için ben sorun yaşıyorum

mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4) 

. Üstteki örnekte yaptığım gibi tek bir veri çerçevesine nasıl ulaşabilirim?

Mapply, bir liste matrisi döndürüyor gibi görünüyor. Veri karelerinin bir listesini vermek için bekliyordum. Ne farklı yapmalıyım?

cevap

23

Geri dönüş değeri olarak data.frames listesini almak için 'un SIMPLIFY argümanını FALSE olarak ayarlayın. (Varsayılan değeri TRUE şeklindedir; bu işlev işlevi "sonucu bir vektör, matris veya daha yüksek boyutlu bir diziye indirgemeye çalışır" - tam olarak ne yaşadığınız).

res <- mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4, 
       SIMPLIFY = FALSE) 

identical(class(res), "list") 
[1] TRUE 
+2

Teşekkür ederiz! Geriye doğru bakıldığında, kılavuzu daha yakından okumalıydım. – Adrian

+3

Sorun değil. Kendimi her ne zaman bulduğumda, "eğer X fonksiyonu Y yaptıysa iyi olmaz mıydı" diye düşündüğüm zaman, bu, yaratıcının yaratıcısının beni düşünceye dövdüğüne dair iyi bir şans olduğunu öğrendim. –

+7

, sermayede olması gereken ihtiyaçları basitleştiren çok aptalcadır. Onun formu, bu grup hakkında – adam

4

Harita işlevini kullanabilirsiniz. Bu, SIMPLIFY ile FALSE olarak ayarlanmış temelde eştir.

Map("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4) 
+0

saplgan grup fonksiyonlarına uymuyor. Her gün yeni bir şey öğrenin – theforestecologist