是否可以循环多个对象并在循环中调用每个对象内的元素

时间:2019-07-11 18:33:17

标签: r loops for-loop

在R中,我想循环使用一组三个函数,而输出则需要从每个函数中保存一个与输入相关的名称。应用于一个文件时,此方法有效,但我想循环遍历300多个对象,并且该功能需要在对象中指定元素。

我试图创建对象列表和输出名称,并使用for循环为单个函数(a.ppp)进行遍历,并收到错误“ i [[“ X”]]中的错误:下标出边界”。我对for循环非常陌生,并且编码背景有限,不确定我创建的循环结构是否正确。我尝试了多种选择,包括遍历数据框或基于其他一些堆栈溢出问题的嵌套循环。

一些玩具数据,代表我的设置。我有数据框,例如。 a-g

a <- data.frame(X = c(1, 2, 3),
            Y = c(3,2,1),
            Z = c(4,5,6),
            M = c('A', 'B', 'C'))

我想遍历以下三个功能。

library(spatstat)

a.ppp = ppp(a$X,a$Y,c(0,3),c(0,3),marks = a$M)
a.nnd = nndist(a.ppp,by=a.ppp$marks)
a.append = cbind(a,a.nnd)

我的尝试已经包括

listObj = c("a","b","c","d","e","f","g")
list.ppp = c("a.ppp","b.ppp","c.ppp","d.ppp","e.ppp","f.ppp","g.ppp")

for (i in listObj) {
for (j in list.ppp) {

   j=ppp(i[["X"]],i[["Y"]],c(0,12),c(0,12),marks=i[["M"]])
  }
}

我收到了错误:

#Error in i[["X"]] : subscript out of bounds

我的预期结果将是.ppp和.append输出到g到

以为我会跟进,基于乔兰的极有帮助的评论。我已经通过修改他提供的代码解决了这个问题。我使用的代码如下

library(spatstat)

 a <- data.frame(X = c(1, 2, 3),
                            Y = c(3,2,1),
                            Z = c(4,5,6),
                            M = c('A', 'B', 'C')) 

 #Create a list of all the vectors in the environment - Not an ideal method but 
 suitable for the case

 dfs= mget(ls())

 #Create empty lists to be populated during the loop
 dfs_ppp = list()
 dfs_nnd = list()
 dfs_final= list()


for (i in seq_along(dfs)){
 dfs_ppp[[i]] <- ppp(dfs[[i]]$X,dfs[[i]]$Y,c(-1,14),c(-1,14),marks = dfs[[i]]$M)
 dfs_nnd[[i]] = nndist(dfs_ppp[[i]],by=dfs_ppp[[i]]$marks)
 dfs_final[[i]] = cbind(dfs[[i]],dfs_nnd[[i]])  
 }

1 个答案:

答案 0 :(得分:2)

尝试更多类似的方法:

library(spatstat)

a <- data.frame(X = c(1, 2, 3),
                                Y = c(3,2,1),
                                Z = c(4,5,6),
                                M = c('A', 'B', 'C'))

# Put your data frames (a, b, c, etc.) in a list
dfs <- list(x = a,b = a,z = a)

for (i in seq_along(dfs)){
    ppp_obj <- ppp(dfs[[i]]$X,dfs[[i]]$Y,c(0,3),c(0,3),marks = dfs[[i]]$M)
    nnd_obj = nndist(ppp_obj,by=ppp_obj$marks)
    dfs[[i]]$nnd <- nnd_obj
}