簡體   English   中英

R; 使用for循環遍歷向量填充矩陣

[英]R; Populating a matrix with a for loop iterating over a vector

我對R不太有經驗,並且一直在努力重復幾天的代碼來填充數據矩陣。 我的本能是創建一個for循環。

我是一名生物學專業的學生,​​致力於利用R包的色差來處理圖像集之間的色差。 相關數據已作為8x4矩陣列表加載到R中(每個矩陣描述一個圖像中的顏色)。 五張圖像組成一組,總共有100套。 每個集合都由一個數字標識(不是1-100,這是一個中斷的序列,但是我已經將數字序列存儲在稱為“數字列表”的向量中)。 我已經編寫了代碼,以正確的格式為第一組提取所需的數據,如下所示;

## extract the list of matrices belonging to the first set (A3) from the the full list
A3<-histlist[grep('^3',names(histlist))] 
## create a colour distance matrix (cdm), ie a pairwise comparison of "similarity" between the five matrices stored in A3
cdm3<-colordistance::getColorDistanceMatrix(A3, method="emd", plotting=FALSE)
## convert to data frame to fix row names
cdm3df<-as.data.frame(cdm3) 
## remove column names
names(cdm3df)<-NULL 
## return elements in the first row and column 2-5 only (retains row names).
cdm3filtered<-cdm3df[1,2:5]

現在,我想用“數字列表”中的每個數字替換上面代碼中的“ 3”(不確定它們應該是as.factor還是as.numeric)。 我已經嘗試過以for (i in numberlist) {...}開頭,但沒有成功輸出。 對我來說,將循環的輸出存儲在存儲矩陣中是有意義的。 matrix(nrow=100,ncol=4)但我非常matrix(nrow=100,ncol=4) ,無法通過重復上面的代碼逐行填充我的存儲矩陣...

任何幫助將不勝感激!

更新

我希望循環的輸出看起來像什么(+附加在存儲矩陣中);

> cdm17filtered                                
17clr 0.09246918 0.1176651 0.1220622 0.1323586

這是我的嘗試:

for (i in numberlist$X) {
  A[i] <- histlist[grep(paste0('^',i),names(histlist))]
  cdm[i] <- colordistance::getColorDistanceMatrix(A[i], method="emd", plotting=FALSE)
  cdm[i]df <- as.data.frame(cdm[i])
  cdm[i]filtered <- cdm[i]df[1,2:5]
  print(A[i]) # *insert in n'th column of storage matrix
}

上面的方法不起作用,並且我缺少在存儲矩陣中存儲循環輸出所需的最后一位。 (建議我不要使用rbind來填充存儲矩陣,因為它很慢。)

在嘗試中,您使用無效的R名稱,這些名稱帶有未轉義的非字母數字字符, cdm[i]dfcdm[i]filtered 看來您打算從較大的容器(例如對象列表)中進行索引。

要正確概括數字列表中所有項目的流程 ,請調整^3設置。 具體來說,構建空列表並循環地由索引[i]分配:

# INITIALIZE LISTS (SAME LENGTH AS numberlist)
A <- vector(mode="list", length = length(numberlist))
cdm_matrices <- vector(mode="list", length = length(numberlist))
cdm_dfs <- vector(mode="list", length = length(numberlist))
cdm_filtered_dfs  <- vector(mode="list", length = length(numberlist))

# POPULATE LISTS
for (i in numberlist$X) {
  ## extract the list of matrices belonging to the first set
  A[i] <- histlist[grep(paste0('^', i), names(histlist))] 

  ## create a colour distance matrix (cdm)
  cdm_matrices[i] <- colordistance::getColorDistanceMatrix(A[i], method="emd", plotting=FALSE)

  ## convert to data frame to fix row names and remove column names
  cdm_dfs[i] <- setNames(as.data.frame(cdm_matrices[i]), NULL)

  ## return elements in the first row and column 2-5 only (retains row names).
  cdm_filtered_dfs[i] <- cdm_dfs[i][1,2:5]
}

或者,如果只需要最后一個返回的對象cdm_filtered_dflapply在不需要使用或索引列表的地方使用lapply ,並且所有對象在功能范圍內都是本地的(即,從不在全局環境中保存):

cdm_build <- function(i) {
  A <- histlist[grep(paste0('^', i), names(histlist))]    
  cdm <- colordistance::getColorDistanceMatrix(A, method="emd", plotting=FALSE)    
  cdm_df <- setNames(as.data.frame(cdm), NULL)    
  cdm_filtered_df <- cdm_df[1,2:5]

  return(cdm_filtered_df)    # REDUNDANT AS LAST LINE IS RETURNED BY DEFAULT
}

# LIST OF FILTERED CDM DATA FRAMES
cdm_filtered_dfs <- lapply(numberlist, cdm_build)

最后,無論采用上述哪種解決方案,如果您要構建單個數據幀,請在do.call()運行rbind

cdm_final_df <- do.call(rbind, cdm_filtered_dfs)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM