2017-09-16 170 views
0

我有一个尺寸为nrow=20, ncol=1000的矩阵bigDaddy。现在我有一个for循环,我想要运行100次迭代,并且在每次迭代中,我想要得到一列10列和所有行bigDaddy。例如在第一次迭代中,所有行和列1-10,第二次迭代所有行和列11-20等等。R - 在for循环中将矩阵按R列逐列切片

这里是我想要的代码:

for(i in seq(from=1, to 991, by=10)) 
{ 
    smallChild <- bigDaddy[,i:i+9] 
} 

但什么是smallChild给我的第一次迭代是矩阵bigDaddy的第10列上创建一个20长度矢量。如果我在smallChild <- bigDaddy[,1:10]这样的代码中对我的值进行硬编码,我会得到预期的矩阵。

有人能指出我正确的方向吗?

+4

你错过了括号'i:(i + 9)'。另外,您一次又一次地将值重新分配给'SmallChild'。当循环结束时,你将只有最后一次迭代。 –

+0

谢谢你,你是对的。来自非R编程背景,我觉得现在R是无望的。 –

回答

1

您可以使用assign以不同名称保存每个SmallChild,例如, SmallChild1,SmallChild11等

for(i in seq(from=1, to 991, by=10)) 
{ 
    temp <- bigDaddy[,i:(i+9)] 
    assign(paste0(SmallChild, i), temp) 
} 
0

考虑使用lapply保存对象的列表,而不是许多单独的(类似结构)对象:

data_list <- lapply(seq(from=1, to=991, by=10), function(i) bigDaddy[,i:(i+9)]) 

甚至给项目名称:

data_list <- setNames(data_list, paste0("SmallChild_", seq(length(data_list)))) 

data_list$SmallChild_1 
data_list$SmallChild_2 
data_list$SmallChild_3 
... 

如果你真的想单独对象在指定的对象列表上运行list2env

list2env(data_list, .GlobalEnv)