R:使用for循环子集未知长度的矩阵

时间:2013-07-19 14:33:22

标签: r for-loop subset

我在一个矩阵(data1)中使用值来确定如何将第二个矩阵(data2)子集化为更小的矩阵(foo)。但是我遇到了问题,因为我无法提前知道foo的大小。

这是一个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]))))
}

我希望foo看起来像这样:

105 yy stim1
230 zz stim1
587 bb stim2

1 个答案:

答案 0 :(得分: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"))

然后你可以使用apply:

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

然后rbind list

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

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