【问题标题】:Is it possible to loop over multiple objects and call to elements within each object in the loop是否可以循环多个对象并调用循环中每个对象内的元素
【发布时间】:2019-07-11 18:33:17
【问题描述】:

在 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

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

只是想我会跟进,基于 Joran 非常有用的评论。我通过修改他提供的代码解决了这个问题。我使用的代码如下

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]])  
 }

【问题讨论】:

    标签: r loops for-loop


    【解决方案1】:

    试试这样的:

    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
    }
    

    【讨论】:

    • 非常感谢,循环工作得很好,并且基于它工作的数据子集。是否可以保存每个循环对象?即创建一个 ppp_A、ppp_B、ppp_C ...和 ​​nnd_A、nnd_B、nnd_C,其中 A、B、C 来自 i。由于当前形式的循环在遍历 DF 时会覆盖数据。对于后续分析,我需要遍历 nnd 和 ppp 对象。非常感谢
    • 类似的方法是使用lapply()ppps &lt;- lapply(dfs, function(DF) ppp(DF$X, ...)nnds &lt;- lapply(ppps, function(ppp_obj) nndist(ppp_obj, ...)。如果您需要将列表附加到原始dfs,则可以执行Map(data.frame, dfs, nnds)
    猜你喜欢
    • 2021-02-27
    • 2021-11-06
    • 2014-12-08
    • 2012-05-08
    • 1970-01-01
    • 2016-01-10
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多