2

我有两个同样长的数据集 - 从“vp”创建的“vpXmin”和“vpXmax”

> head(vpXmin)
                 vp
[1,] 253641 2621722
[2,] 253641 2622722
[3,] 253641 2623722
[4,] 253641 2624722
[5,] 253641 2625722
[6,] 253641 2626722

> head(vpXmax)
                 vp
[1,] 268641 2621722
[2,] 268641 2622722
[3,] 268641 2623722
[4,] 268641 2624722
[5,] 268641 2625722
[6,] 268641 2626722

我想使用“rbind”连接这些数据集中的每一行,并想创建单独的矩阵;例如

l1<-rbind(vpXmax[1,],vpXmin[1,])
l2<-rbind(vpXmax[2,],vpXmin[2,])
 ... ...

尽管我不熟悉 R 循环,但我想将这么大的数据处理为循环......但我在尝试这个时失败了:

for (i in 1:length(vp)){rbind(vpXmax[i,],vpXmin[i,])}

知道为什么吗?另外,如果有的话,请给一些很好的参考来学习使用 R 的不同类型的循环。提前致谢。

4

2 回答 2

0

正如@ToNoy 所指出的,您想要的输出类型并不明显。最简单的方法是创建一个列表,其中每个元素都是rbind两个原始数据帧的每一行的结果。

A <- data.frame("a" = runif(100, -1, 0), "b" = runif(100, 0, 1))                                                                                                                     
Z <- data.frame("a" = runif(100, -2, -1), "b" = runif(100, 1, 2))                                                                                                                    

output <- vector("list", nrow(A))                                                                                                                                                    
for (i in 1:nrow(A)) {                                                                                                                                                               
    output[[i]] <- rbind(A[i, ], Z[i, ])                                                                                                                                             
}                                                                                             
于 2013-08-02T06:05:49.557 回答
0

也许是这样的:

vpXmax <- matrix(1:10,ncol=2)
vpXmin <- matrix(11:20,ncol=2)

l <- lapply(1:nrow(vpXmin),function(i) rbind(vpXmax[i,],vpXmin[i,]) )

然后,而不是l1, l2etc etc 你有

l[[1]]
#     [,1] [,2]
#[1,]    1    6
#[2,]   11   16
l[[2]]
#     [,1] [,2]
#[1,]    2    7
#[2,]   12   17

尽管它可能并不理想,但您的初始循环存在一个主要问题。您没有分配输出,因此您需要使用assign<-以某种方式实际制作对象。但是,使用assign, 几乎是一个标志,可以敲响警钟,表明有更好的方法来做事,并且<-需要预先分配或其他填充。尽管如此,它还是会起作用,尽管它会用l1 l2...ln对象污​​染您的工作空间:

for (i in 1:nrow(vpXmax)) {assign(paste0("l",i), rbind(vpXmax[i,],vpXmin[i,]) )}

> l1
#     [,1] [,2]
#[1,]    1    6
#[2,]   11   16

> l2
#     [,1] [,2]
#[1,]    2    7
#[2,]   12   17
于 2013-08-02T06:06:55.480 回答