2013-07-19 3 views
0

하나의 행렬 (data1)에 값을 사용하여 두 번째 행렬 (data2)을 더 작은 행렬 (foo)로 서브 세트하는 방법을 결정합니다. 그러나 나는 foo의 크기를 미리 알 수있는 방법이 없기 때문에 문제가 발생합니다.R : for 루프를 사용하여 길이를 알 수없는 행렬 subset을

여기 MWE가 있습니다 (실제 데이터 구조체는 100,000+ 행 길이입니다).

data1 <- rbind(c(102,250,'stim1'),c(477,839,'stim2')) 
data2 <- rbind(c(99,'xx'),c(105,'yy'),c(230,'zz'),c(312,'aa'),c(587,'bb'),c(846,'cc')) 

foo <- NULL 
for(i in 1:nrow(data1)) 
{ 
     foo[i,1] <- subset(data2,as.numeric(data2[,1]) > as.numeric(data1[i,1]) & as.numeric(data2[,1]) < as.numeric(data1[i,2])) 
     foo[i,2] <- rep.int(data1[i,3],nrow(subset(data2,as.numeric(data2[,1]) > as.numeric(data1[i,1]) & as.numeric(data2[,1]) < as.numeric(data1[i,2])))) 
} 

I는 다음과 같이 할 foo는 싶습니다

105 yy stim1 
230 zz stim1 
587 bb stim2 
+0

, 데이터가 데이터 유형을 하나 이상 포함 된 경우 행렬을 사용하지 않는 , 여기 정수와 문자. data.frames를 사용해야합니다. – flodel

+0

죄송합니다, 원본은 데이터 프레임입니다 ... 나는 방금 MWE에서 그 작업을 수행하지 않았습니다. – sheepskin

+0

여기에 몇 가지 문제가 있습니다 : (1)'data1'과'data2'는 숫자 프레임이 숫자가 될 수 있고 문자가 아닐 수 있도록 데이터 프레임이어야합니다. (2)'foo [i, 1]'을 할당하는 함수는 행렬을 반환하지만'foo [i, 1]'은 단일 값입니다. 필자의 제안은'foo'는 행렬이 아닌'행렬 목록 '이어야한다는 것입니다. 그렇게하면 어쨌든 얼마나 큰지 알 필요가 없습니다. –

답변

1

먼저, 당신은 data.frame에 무엇을 넣어.

data1 <- data.frame(A=c(102, 477), B=c(250, 839), C=c("stim1", "stim2")) 
data2 <- data.frame(a=c(99, 105, 230, 312, 587, 846), 
        b=c("xx", "yy", "zz", "aa", "bb", "cc")) 

그럼 당신은 적용 사용할 수 있습니다

List <- apply(data1, 1, function(X) 
        cbind(data2, c=X[[3]])[data2$a > X[1] & data2$a < X[2],]) 

을 다음 rbindlist : 처음에는

DF <- do.call(rbind, List) 
DF 

    a b  c 
2 105 yy stim1 
3 230 zz stim1 
5 587 bb stim2 
+0

감사합니다. – sheepskin

관련 문제