2011-03-08 17 views
9

Belirli modelleme tekniklerini uygularken sonuç oluşturma işlemini otomatikleştirmek istiyorum. Bu yüzden uygulanacak farklı parametreler (örneğin, hiyerarşik kümeleme mesafeleri ve bağlantı yöntemleri) olacaktır. Sonuçlar bir matris forma sahip olacak, böylece model parametrelerini (örn., Tek, öklid) belirterek bireysel sonuçlara erişebiliyorum. Bir veri çerçevesinde sütunları ve satırları adlandırabilir ve öğelere yalnızca df[rname[1],cname[1]] aracılığıyla erişebilirim. Okuduğum kadarıyla liste sonuçlarını saklamak için veri çerçevesi nesnelerini kullanmak mümkün değil. Bu yüzden liste sonuçlarını saklamak için listelere ihtiyacım var. Ancak listelerde sadece lst$cname[1]'u belirtebilir ve her iki boyutu da belirtebilirim. Doğrumuyum?R'de liste biçimindeki sonuçları saklamak için iyi bir strateji nedir?

# data frame layout for numeric results does not work with list results 
rname<-c("u","v","w") 
cname<-c("ave","single") 

# dataframe for results but does not work for results which are lists 
paste.1<-function(x,y) paste(x,y,sep=".") 
df1<-data.frame(lapply(cname,paste.1,x=rname),row.names=rname) 
colnames(df1)<-cname 

# creating list for results - do not get a good idea to proceed from here Advices?? 
lst<-(lapply(cname,paste.1,x=rname)) 
names(lst)<-cname 

# results example - could be anything else 
# with a dataframe I could use df1[rname,cname]<-foo(rname,cname) 
# with lists I guess its not as easy 
require(graphics) 
ave.u <- hclust(dist(USArrests,"euclidean"), cname[1]) 
ave.v <- hclust(dist(USArrests,"maximum"), cname[1]) 
ave.w <- hclust(dist(USArrests,"manhattan"), cname[1]) 
single.u <- hclust(dist(USArrests,"euclidean"), cname[2]) 
single.v <- hclust(dist(USArrests,"maximum"), cname[2]) 
single.w <- hclust(dist(USArrests,"manhattan"), cname[2]) 

Var olduğunu tahmin ettiğim bir çözüm olup olmadığından emin değilim. Sonunda liste sonuçlarına satır isimleri ve sütun isimleri ile erişmek istiyorum. Satır/sütun adlarını sayısal olanlara aktarabilirim ve sonra sonuçlarımın (rname) x uzunluğu (cname) listesinde bulmak için uygun dizinler atayarak oynayabileceğimi ancak veri çerçevesinin kullanmak için çok güzel olduğunu varsaydığımdan daha kullanıcı dostu saklamak için kolay bir yol olmalı. Ayrıca, R ile birlikte oynamaya başladığımdan beri liste kavramına gerçekten iyi bakmadığım da söz konusu olabilir. Benim sorum şu: Yapısal sonuçları saklamak için iyi bir strateji ne olurdu (listeler) R kullanarak? Örneğin,

nr <- length(rname) 
nc <- length(cname) 

m <- matrix(list(), nr, nc, dimnames = list(rname, cname)) 

m[["u", "ave"]] <- ave.u 

# etc. 

değerlerinin tüm kombinasyonların satır adları, rnm ve kolon adları, cnm ve bir veri çerçevesi, g oluşturur:

+0

Bunu gerçekten bir veri çerçevesine dönüştürmek mümkün mü?Anladığım kadarıyla, veri çerçevesi dikdörtgen olmalı, liste ise herhangi bir boyutta olabilir. – Sam

+0

r'de AFAIK veri çerçeveleri aynı uzunluktaki listeler olarak uygulanır. – richiemorrisroe

+2

Bu sorunun özellikle kafa karıştırıcı olduğunu düşünüyorum. Neyi başarmaya çalıştığınızın açık bir açıklaması uzun bir yol olacaktır. – Ista

cevap

3

bir listeleri bir matris olabilir.

rnm <- c("euclidean", "maximum", "manhattan") 
cnm <- c("ave", "single") 
g <- expand.grid(rnm, cnm) 
f <- function(i) hclust(dist(USArrests, g[i,1]), g[i,2]) 
m <- matrix(lapply(1:nrow(g), f), length(rnm), dimnames = list(rnm, cnm)) 

Böyle elemanları erişebilir:

> m[["euclidean", "single"]] 

Call: 
hclust(d = dist(USArrests, g[i, 1]), method = g[i, 2]) 

Cluster method : single 
Distance   : euclidean 
Number of objects: 50 
+0

İlginç bir çözüm, düşündüğüm şey buydu ama çalışmayı başaramadı. expand.grid() bilmek güzel. Çözüm James önerisine benziyor ama bir şekilde bu matris benzeri yapılarla daha rahat hissediyorum. Teşekkürler – Sebastian

3

art arda $ operatörünü kullanabilirsiniz, örneğin: Sonra listelerin bir matris, m oluşturmak

mname <-c("euclidean","maximum","manhattan") 
lst <- sapply(mname,function(x) sapply(cname,function(y) hclust(dist(USArrests,x),y),simplify=F),simplify=F) 
names(lst)<-rname 

Ve yapabilirsiniz referans vermek için aşağıdakileri kullanın:

lst$"u"$"ave" 

Call: 
hclust(d = dist(USArrests, x), method = y) 

Cluster method : average 
Distance   : euclidean 
Number of objects: 50 

Maalesef lst$rname[1]$cname[1] çalışmaz, ancak do.call kullanabilirsiniz:

do.call(`$`,list(do.call(`$`,list(lst,rname[1])),cname[1])) 

Call: 
hclust(d = dist(USArrests, x), method = y) 

Cluster method : average 
Distance   : euclidean 
Number of objects: 50 

Edit Orada daha basit bir versiyonu aslında, ama sizin köşeli ayraç anahtarlarını yıpranacaktır

!

lst[[rname[1]]][cname[1]] 
$ave 

Call: 
hclust(d = dist(USArrests, x), method = y) 

Cluster method : average 
Distance   : euclidean 
Number of objects: 50 

Düzenleme 2

yukarıdaki köşeli ayraç notasyonu düzgün nesneyi dönmez demektir list nesne sarmak gibi görünüyor, ama yorumlarda Hadley'in öneri nettir ve bu kaçınır Sorun:

lst[[c(rname[1],cname[1])]] 
+1

'lapply' kullanın, sapply (..., basitleştirin = F)'. Ayrıca bir vektörü [[':' lst [[c ("u", "ave")]] '' – hadley

+0

@hadley'de orijinal olarak 'lapply'' kullanmış, ancak' sapply' kullanarak sona erdi, çünkü isimleri koydu otomatik olarak ve 'basitleştirerek = F' ile esas olarak "lapply" ile aynıdır. Bir vektör kullanmak için iyi bir çağrı ile [['okunması çok daha açık ve gönderdiğim yöntem öğeyi bir' liste'de sarar, böylece bir hclust' nesnesini döndürmez. – James

+0

Teşekkürler. Tam olarak aradığım çözüm. Büyük yardım Sadece uygulama fonksiyonu aile daha anlamak için etrafında oynamak gerekir. lst [[c (rname [1], cname [1])]] 'i kullanarak kendi başıma çözüm bulamazdım. Bu bana çok yardımcı oldu. – Sebastian

İlgili konular