r - R; 使用遍历向量的 for 循环填充矩阵
问题描述
我对 R 不是很有经验,并且几天来一直在努力重复一串代码来填充数据矩阵。我的直觉是创建一个 for 循环。
我是一名生物学学生,使用 R 包 colordistance 研究图像集之间的颜色差异。相关数据已作为 8x4 矩阵列表加载到 R 中(每个矩阵描述一个图像中的颜色)。五幅图像构成一组,总共有 100 组。每组由一个数字标识(不是 1-100,它是一个中断的序列,但我已将数字序列存储在一个名为“numberlist”的向量中)。我已经编写了代码来为第一组以正确的格式提取所需的数据,如下所示;
## 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]
现在我想用'numberlist'中的每个数字替换上面代码中的“3”(不确定它们应该是as.factor还是as.numeric)。我已经进行了很多尝试,for (i in numberlist) {...}
但没有成功的输出。对我来说,将循环的输出存储在存储矩阵中是有意义的;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]df
并且cdm[i]filtered
. 您似乎打算从更大的容器(如对象列表)中进行索引。
要正确概括numberlist中所有项目的流程,请调整您的^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_df
返回的最后一个对象,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)
最后,对于上述任一解决方案,如果您想构建一个单一的数据框,请rbind
在以下位置运行do.call()
:
cdm_final_df <- do.call(rbind, cdm_filtered_dfs)
推荐阅读
- azure-functions - 如何将 blob 存储事件推送到事件网格主题
- hibernate - Hibernate二级缓存n个数据库数据不同步,如何解决这个问题
- gmail-api - 如何从 Microsoft Flow 监控 gmail API 使用情况?
- css - 浏览器如何将 mixin 转换为常规 css
- python-2.7 - sqlite 窗口函数来获取差异和产品
- laravel - Laravel 避免模型中的重复条目
- android - 从内部资源文件中解析 json
- vba - 使用通配符查找所有排除的匹配字符串
- python - 线宽在 axvline 中做什么?
- javascript - 将军事时间添加到对象