【发布时间】:2019-05-27 23:41:50
【问题描述】:
我对 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 来填充存储矩阵,因为它很慢......)
【问题讨论】:
-
你试过for循环吗,
grep(paste0('^',i)... -
@anotherfred。谢谢, paste0() 函数可能很有用。但是
for(i in numberlist){ A[i]<-histlist[grep(paste0('^',i),names(histlist))] print(A[i]) }只返回一个,而不是每个 i 的全部五个矩阵。相反,histlist[grep('^3',names(histlist))]工作正常,并返回属于 i=3 的所有 5 个矩阵。 -
真的吗?
numberlist中有什么内容? 3 in 循环返回什么?A是如何初始化的?请使用所有需要的输入设置一个更完整的代码块。 -
@T.Ferg 为您提供适当的帮助,我们需要一个最小的数据集来使用。如果可以,对数据进行子集化,在其上调用
dput,然后发布结果。祝你好运! -
试试
for(i in numberlist$X...no)。听起来 numberlist 不是一个向量,而是一个名为 X...no 的列的结构。
标签: r loops for-loop matrix iteration