2017-09-16 172 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)