2013-06-04 2 views
4

나는 R에 대한 상대적으로 초보자이며 지금은 여러 단계에서 지금까지 나를 도왔던 모든 사람들에게 감사의 말로 오히려 긴 스크립트로 끝나는 것에 아주 가깝다. 내가 붙어있는 또 다른 요점이있다. 나는이에 문제를 단순화 :모든 가능한 두 개의 열 하위 집합을 얻는 것

Dataset1 
ax ay 
1 3 
2 4 

Dataset2 
bx by 
5 7 
6 8 

A <- dataset1 
B <- dataset2 
a <- 2 #number of columns 
b <- 1:2 

(내 데이터 세트 컬럼의 수에 따라 다르며 그래서이 요인이 변화 할 수 있어야합니다)

내가 어떤 순서로이 답변을 원하는 (즉 모든 이 두 데이터 세트 각각에서 두 개의 열을 하나씩 조합 할 수 있음).

[[1]] 
1 5 
2 6 

[[2]] 
1 7 
2 8 

[[3]] 
3 5 
4 6 

[[4]] 
3 7 
4 8 

그러나 나는 그것을 얻지 못하고있다. 네,

i <- 1 
for(i in 1:a) 
{ 
    e <- lapply(B, function(x) as.data.frame(cbind(A, x))) 
    print(e) 
    i <- i+1 
    } 

닫기 : 나는 사물의 무리와 내가 원하는 가장 가까운이 함께 있었다를 시도했다. 나는 대답을하고 바이올린을 치고 서브 셋팅을 할 수는 있지만 올바르지 않고 쉬운 방법이 있어야합니다. 나는 온라인 검색에서 이와 같은 것을 보지 못했다. 어떤 도움을 많이 주셨습니다.

답변

1

나는 가장 쉬운 방법은 시도했던 것과 매우 유사하다고 생각합니다. 두 개의 명시적인 루프를 사용하십시오. 그러나, 나는 다르게 할 것이 몇 가지가 아직 없습니다 :

  1. 사전 그런 다음 다음을 수행 할 수있는 명시 적 counter
  2. 사용 drop=FALSE

를 사용하여 목록 공간

  • 을 할당합니다.

    A <- read.table(text = "ax ay 
    1 3 
    2 4", header = TRUE) 
    
    B <- read.table(text = "bx by 
    5 7 
    6 8", header = TRUE) 
    
    out <- vector("list", length = ncol(A) * ncol(B)) 
    counter <- 1 
    for (i in 1:ncol(A)) { 
        for (j in 1:ncol(B)) { 
         out[[counter]] <- cbind(A[,i, drop = FALSE], B[,j, drop = FALSE]) 
         counter <- counter + 1 
        } 
    } 
    out 
    
    ## [[1]] 
    ## ax bx 
    ## 1 1 5 
    ## 2 2 6 
    ## 
    ## [[2]] 
    ## ax by 
    ## 1 1 7 
    ## 2 2 8 
    ## 
    ## [[3]] 
    ## ay bx 
    ## 1 3 5 
    ## 2 4 6 
    ## 
    ## [[4]] 
    ## ay by 
    ## 1 3 7 
    ## 2 4 8 
    
  • +0

    완벽한! 정확히 내가 필요로하는 것. 나는 특히 explcit 카운터를 좋아한다. 나는 옳은 일을하고 있지만 그곳에있는 것이 아니라는 것을 느낍니다. 그리고 지금 그것을 봅니다. 매우 감사! –

    6

    다음과 같은 것이 있습니까?

    Dataset1 <- data.frame(ax=1:2,ay=3:4) 
    Dataset2 <- data.frame(bx=5:6,by=7:8) 
    
    apply(
        expand.grid(seq_along(Dataset1),seq_along(Dataset2)), 
        1, 
        function(x) cbind(Dataset1[x[1]],Dataset2[x[2]]) 
        ) 
    

    결과 :

    [[1]] 
        ax bx 
    1 1 5 
    2 2 6 
    
    [[2]] 
        ay bx 
    1 3 5 
    2 4 6 
    
    [[3]] 
        ax by 
    1 1 7 
    2 2 8 
    
    [[4]] 
        ay by 
    1 3 7 
    2 4 8 
    
    +0

    이것은 실제로 잘 작동하지만 Henrik이 제공 한 카운터가 필요합니다. 나는 옳은 대답으로 양쪽을 똑딱 거리고 싶다. 대답 할 시간을내어 주셔서 감사합니다. 나는 그것을 고맙게 생각한다. –

    +0

    @ NatalieBjorklund - 거의 확실하게 일종의 카운터를 생성하는 방법이 있습니다. 이 경우 카운터는 '길이 (결과)'로 끝납니다. R의'for (i in ...) '로직은 장기적으로 볼 때 종종 복잡해 지지만, 이것은 더 큰 스크립트의 일부일뿐입니다. – thelatemail

    +0

    카운터는 더 긴 스크립트 내에서 의미가 있지만, 말하기는 내가 덜 복잡한 것처럼 나는 당신의 대답으로 카운터를 없앨 수 있는지를 점검 할 것입니다. 고마워. –

    1

    내가 질문을 이해한다면, 당신이 원하는 열을 선택하는 combn를 사용할 수 있다고 생각합니다. 시에서 2를 촬영 8 개 컬럼의 모든 조합을 원한다면 예를 들어, 당신은 할 수 :

    combn(1:8, 2) 
    

    (가독성을 위해 부분적으로)주는 :

    combn(1:8,2)[,c(1:5, 15:18)] 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
    [1,] 1 1 1 1 1 3 3 3 3 
    [2,] 2 3 4 5 6 5 6 7 8 
    

    을 그럼이 행렬의 열 수 원하는 색인으로 사용하십시오.

    +0

    동일한 수의 열이있을 수도 있고 없을 수도있는 다른 데이터 집합을 반복해서 사용할 수 있어야하고 각 데이터 집합의 열 수를 무시할 수 있기 때문에이 방법이 효과가 있다고 생각하지 않습니다. 그것이 생성됨에 따라. 하지만 시간 내 주셔서 감사합니다. 고맙습니다. –

    +0

    @NatalieBjorklund 나중에 사용할 수 있도록 각 데이터 세트를 읽을 때'ncol'을 사용하면 도움이되는 경우 열 수를 찾을 수 있습니다. –

    +0

    예 나는 그것을 알아 차리고 그것을 메모했다. 그것은 미래에 유용 할 것입니다. –

    관련 문제