2011-03-08 2 views
9

특정 모델링 기술을 적용 할 때 결과 생성 프로세스를 자동화하고 싶습니다. 따라서 적용 할 다양한 매개 변수 (예 : 계층 적 클러스터링 거리 및 연결 방법)를 사용하겠습니다. 결과는 행렬 형식을 가지므로 모델 매개 변수 (예 : 단일, 유클리드)를 지정하여 개별 결과에 액세스 할 수 있습니다. 데이터 프레임에서 열과 행의 이름을 지정하고 요소를 액세스 할 수있는 곳은 df[rname[1],cname[1]]입니다. 지금까지 내가 읽은 것처럼 데이터 프레임 객체를 사용하여 목록 결과를 저장할 수는 없습니다. 목록 결과를 저장하기위한 목록이 필요합니다. 그러나 목록에서 나는 lst$cname[1] 만 지정할 수 있으며 두 가지 치수는 지정할 수 없습니다. 나 맞아? 내가 존재해야합니다 생각 해결책이있는 경우 나중에 인덱스 대신 이름으로 액세스하기 위해 결과를 목록 형식으로 저장하는 R의 좋은 전략은 무엇입니까?

# 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]) 

는 잘 모르겠습니다. 결국에는 행 이름과 열 이름을 통해 목록 결과에 액세스하려고합니다. 난 행/열 이름을 숫자로 전송할 수있는 길이 ( rname) 길이 ( cname)의 목록에서 내 결과를 찾을 수있는 적절한 색인을 할당하지만, 데이터 프레임이 너무 멋지게 사용하고 있기 때문에 나는 그것을 추측하고 있기 때문에 재생할 수 있습니다. 더 쉽게 사용자 친화적 인 방법으로 저장해야합니다. R을 가지고 놀기 시작한 이래로 목록의 개념을 잘 이해하지 못했을 수도 있습니다. 그래서 제 질문은 구조화 된 결과를 저장하는 좋은 전략은 무엇일까요? R? 예를 들어,

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

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

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

# etc. 

그 값의 모든 조합의 열 이름 rnm와 열 이름 cnm, 데이터 프레임 g을 형성 :

+0

실제로 데이터 프레임을 만들 수 있습니까?내가 이해하는 한, 데이터 프레임은 직사각형이어야하며 목록은 모든 차원이 될 수 있습니다. – Sam

+0

r의 AFAIK 데이터 프레임은 같은 길이의 목록으로 구현됩니다. – richiemorrisroe

+2

이 질문은 특히 혼란 스럽습니다. 달성하려는 목표에 대한 명확한 설명은 먼 길을 갈 것입니다. – Ista

답변

3

하나는 목록의 매트릭스를 가질 수있다.

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)) 

우리는 다음과 같은 요소에 액세스 할 수 있습니다 :

> 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

흥미로운 솔루션, 이것은 내가 생각하고 있었지만 작동 시키도록 할 수는 없었습니다. expand.grid()는 알아두면 좋습니다. 이 솔루션은 제임스 제안과 유사하지만 어떻게 든 그 매트릭스가 비슷하게 구조가 더 편하다고 느낍니다. 감사합니다. – Sebastian

3

당신은 반복적으로 $ 연산자를 사용할 수 있습니다, 예를 들면 : 다음 목록의 매트릭스, m 만들

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 

을 그리고 당신은 할 수 다음을 참조 용으로 사용하십시오 :

lst$"u"$"ave" 

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

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

불행하게도, lst$rname[1]$cname[1]이 작동하지 않습니다,하지만 당신은 do.call를 사용할 수 있습니다

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 

편집을이 간단한 버전은 사실이지만, 그것은 당신의 대괄호 키를 입을 것

!

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

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

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

편집 2

위의 각 괄호 표기법이 제대로 개체를 반환하지 않습니다 의미 list에서 개체를 래핑하는 것 같지만 코멘트에 해들리의 제안이 명확이를 방지 문제 :

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

'sapply (..., simplify = F)'가 아니라'lapply'를 사용하십시오. – hadley

+0

@hadley 나는 원래'lapply'를 사용했으나 이름을 설정했기 때문에'sapply'를 사용하여 끝내기도했습니다 (''lpply '['c : "u", "ave"]] 자동적으로, 그리고'simplify = F'는'lapply'와 본질적으로 같습니다. 벡터를 사용하여''[[[''[<] 읽는 것이 훨씬 명확 해졌고, 내가 게시 한 메쏘드는''목록에 항목을 래핑하므로''hclust' 객체를 반환하지 않습니다. – James

+0

감사. 정확히 내가 찾던 해결책이었습니다. 큰 도움. 적용 함수 패밀리를 더 이해하기 위해서는 놀아야 만합니다. lst [[c (rname [1], cname [1])]]]을 사용하여 솔루션을 찾지 못했습니다. 그것은 나를 많이 도왔다. – Sebastian

관련 문제