2017-02-27 3 views
1

이것은 내가 수행중인 숙제 문제와 관련이 있습니다. I는 행렬로 몇 벡터의 데이터 조작을 수행해야하고, TA는 combn 기능 사용 제안 :와R에서 빗을 사용하여 모든 가능한 조합의 행렬을 만듭니다.

# what I'm starting with 
a = c(1, 2) 
b = c(NA, 4, 5) 
c = c(7, 8) 

# what I need to get 
my_matrix 
a b c 
1 NA 7 
1 NA 8 
1 4 7 
1 4 8 
1 5 7 
1 5 8 
2 NA 7 
2 NA 8 
2 4 7 
2 4 8 
2 5 7 
2 5 8 

my_matrix은 A, B 및 C 요소들의 모든 가능한 조합을 갖는 행렬을 열 이름은 a, b 및 c입니다. 나는 combn()이하는 일을 이해하지만 위의 행렬로 변환하는 방법을 정확히 모르십니까?

미리 도움을 청하십시오!

+1

'expand.grid (a = a, b = b, c = c)'? –

+0

콤보를 사용하는 것이 거의주의 산만이었습니다. 감사! – Canovice

+0

힌트는 미묘 할 수도 있습니다 - '? combn' 도움말 파일은'참조. '섹션의'expand.grid'에 '* 모든 요소 또는 벡터 조합에서 데이터 프레임을 만들 때 *'와 함께 설명합니다. – thelatemail

답변

1

expand.grid은 질문에 대한 언급에 언급 된대로 더 쉽고 쉽게 할 수 있습니다. 하지만 combn도 사용할 수 있습니다.

#STEP 1: Get all combinations of elements of 'a', 'b', and 'c' taken 3 at a time 
temp = t(combn(c(a, b, c), 3)) 

# STEP 2: In the first column, only keep values present in 'a' 
#Repeat STEP 2 for second column with 'b', third column with 'c' 
#Use setNames to rename the column names as you want 
ans = setNames(data.frame(temp[temp[,1] %in% a & temp[,2] %in% b & temp[,3] %in% c,]), 
                    nm = c('a','b','c')) 
ans 
# a b c 
#1 1 NA 7 
#2 1 NA 8 
#3 1 4 7 
#4 1 4 8 
#5 1 5 7 
#6 1 5 8 
#7 2 NA 7 
#8 2 NA 8 
#9 2 4 7 
#10 2 4 8 
#11 2 5 7 
#12 2 5 8