【问题标题】:Store vectors with different length as a list in R将不同长度的向量存储为R中的列表
【发布时间】:2018-08-06 23:34:31
【问题描述】:

对于下面的代码,我想将每个边的 (a*b) 存储在向量 op1 中,然后将所有向量存储在列表 opp1 中。根据给定的数据:我应该有 5 个向量 op1每个具有不同长度的向量(例如:length(op1[1]=3) 而其余长度为 2 的向量就像 length(op1[2]=2)),我将有一个列表 @987654328 @ 包含不同长度的向量。

将值存储在向量中是可以的,但我的问题是在存储这些向量时,结果列表包含向量但长度相同,即opp1list 由长度为 3 的所有op1 向量组成,所以有不知从何而来的奇怪价值。

library(igraph)
graph<-matrix(c(4,3,4,1,4,2,3,2,3,1),ncol=2,byrow=TRUE)
g<-graph.data.frame(d = graph, directed = FALSE)
v1<-c()
v2<-c()
n1<-list()
n2<-list()
op1<-c()
opp1<-list()
for (edge in 1:length(E(g))){
  v1[edge] <- ends(graph = g, es = edge)[1]
  v2[edge] <- ends(graph = g, es = edge)[2]
  n1[[edge]] <- names(neighbors(g, v1[edge], mode = "all"))
  n2[[edge]] <- names(neighbors(g, v2[edge], mode = "all"))
for (neighbor in 1:length(n2[[edge]])){
a<-as.numeric(v2[edge])
b<-as.numeric(n2[[edge]][neighbor])
c<-(a*b)
op1[neighbor]<-c
}
opp1[[edge]]<-op1
}

列表opp1是:

 opp1
[[1]]
[1] 12  3  6

[[2]]
[1] 4 3 6

[[3]]
[1] 8 6 6

[[4]]
[1] 8 6 6

[[5]]
[1] 4 3 6

应该是这样的:

 opp1
[[1]]
[1] 12  3  6

[[2]]
[1] 4 3 

[[3]]
[1] 8 6 

[[4]]
[1] 8 6

[[5]]
[1] 4 3 

对于如何修复代码有什么建议吗,还有其他方法可以用不同的方式完成相同的工作,尤其是在处理大数据时可以节省时间和内存。 提前致谢。

【问题讨论】:

    标签: arrays r list loops matrix


    【解决方案1】:

    您必须在第一个 for 循环中初始化 op1,以便在每个循环中都有一个干净的 op1,如下所示:

     for (edge in 1:length(E(g))){
       op1<-c()
       v1[edge] <- ends(graph = g, es = edge)[1]
       v2[edge] <- ends(graph = g, es = edge)[2]
       n1[[edge]] <- names(neighbors(g, v1[edge], mode = "all"))
       n2[[edge]] <- names(neighbors(g, v2[edge], mode = "all"))
       for (neighbor in 1:length(n2[[edge]])){
         a<-as.numeric(v2[edge])
         b<-as.numeric(n2[[edge]][neighbor])
         c<-(a*b)
         op1[neighbor]<-c
       }
       opp1[[edge]]<-op1
    
     }
    

    你的输出:

    opp1
    [[1]]
    [1] 12  3  6
    
    [[2]]
    [1] 4 3
    
    [[3]]
    [1] 8 6
    
    [[4]]
    [1] 8 6
    
    [[5]]
    [1] 4 3
    

    没有for循环更好更快:

     n<-length(E(g))
    
     v1x<-unlist(lapply(lapply(c(1:n),ends,graph=g),"[[",1))
     v2x<-unlist(lapply(lapply(c(1:n),ends,graph=g),"[[",2))
    
     n1x<-lapply(lapply(v1x,neighbors,graph=g,mode="all"),names)
     b<-Map(as.numeric,lapply(lapply(v2x,neighbors,graph=g,mode="all"),names))
    
     a<-mapply(rep, as.numeric(v2x), lapply(n2x,length))
    
     opp1<-Map('*',a,b)
    opp1
    [[1]]
    [1] 12  3  6
    
    [[2]]
    [1] 4 3
    
    [[3]]
    [1] 8 6
    
    [[4]]
    [1] 8 6
    
    [[5]]
    [1] 4 3
    

    【讨论】:

    • 恐怖 感谢您的帮助。您是否建议使用另一种有效的方式(如果存在)而不是这个循环?因为我需要多次迭代它并且需要大量数据..
    • 在答案中完成。
    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多