试图从r中的循环输出列表列表

时间:2015-06-18 12:05:22

标签: r loops

我正在尝试做一些我确信应该非常简单的事情:我正在尝试创建一个函数,将一对数字对(pairedList)和一个向量(botList)转换为一系列向量(每个向量一个)长度(botlist),其中这些向量中的数字都等于零,除了那些对应于由1对标识的索引点的数字。

#generating mock data to simulate my application:
  pair1 <- c(2,4)
  pair2 <- c(1,3)
  pair3 <- c(5,6)
  pairedList <- c(pair1, pair2, pair3)
  botList <- c(1:length(pairedList))

以下是输出最终的结果:

[1] 0 1 0 1 0 0
[1] 1 0 1 0 0 0
[1] 0 0 0 0 1 1

下面的代码允许我以正确的方式打印向量(通过用print(prob)替换if循环中的行并注释掉最终的print语句):

library(gtools)
test <- function() {


#initialising empty list
  output <- list()

  for (i in botList) {
    x <- rep(0, length(pairedList))
    ind <- pairedList[i:(i+1)]
    ind.inv <- sort(ind, decreasing=T)
    val <- rep(1,length(ind))
    new.x <- vector(mode="numeric",length(x)+length(val))
    new.x <- new.x[-ind]
    new.x[ind] <- val
    prob <- new.x

    if (odd(i)) {
      output[i] <- prob
    }
    print(output)
  }
}

但是我需要从我的函数返回这个向量列表而不是打印它,当我这样做时,我得到以下输出并遇到错误和一些警告:

[[1]]
[1] 0

[[1]]
[1] 0

[[1]]
[1] 0

[[2]]
NULL

[[3]]
[1] 1

[[1]]
[1] 0

[[2]]
NULL

[[3]]
[1] 1

[[1]]
[1] 0

[[2]]
NULL

[[3]]
[1] 1

[[4]]
NULL

[[5]]
[1] 0

Error in new.x[-ind] : only 0's may be mixed with negative subscripts
In addition: Warning messages:
1: In output[i] <- prob :
  number of items to replace is not a multiple of replacement length
2: In output[i] <- prob :
  number of items to replace is not a multiple of replacement length
3: In output[i] <- prob :
  number of items to replace is not a multiple of replacement length

我的问题是: 如何更改我的代码以从此函数输出我需要的内容?我认为这将是一个五分钟的工作,在这个小小的事情上我被困住了几个小时后!

提前致谢

3 个答案:

答案 0 :(得分:1)

你可以试试的东西,虽然必须有更好的方法:

# create a list with all the "pair1", "pair2", ... objects
l_pairs <- mget(ls(pattern="^pair\\d+")) 
# compute maximum number among the values of pair., it determines the number of columns of the results
n_max <- max(unlist(l_pairs)) 

# finally, create for each pair. a vector of 0s and put 1s at the positions specified in pair.    
res <- t(sapply(l_pairs, function(x){y <- rep(0, n_max); y[x]<-1; y})) 

res
#      [,1] [,2] [,3] [,4] [,5] [,6]
#pair1    0    1    0    1    0    0
#pair2    1    0    1    0    0    0
#pair3    0    0    0    0    1    1

答案 1 :(得分:1)

您可以使用row/col索引

 m1 <- matrix(0, ncol=max(pairedList), nrow=3)
 m1[cbind(rep(1:nrow(m1),each=2), pairedList)] <- 1
 m1
 #    [,1] [,2] [,3] [,4] [,5] [,6]
 #[1,]    0    1    0    1    0    0
 #[2,]    1    0    1    0    0    0
 #[3,]    0    0    0    0    1    1

答案 2 :(得分:0)

詹姆斯,以下应该有效。我刚试过它。

pair1 <- c(2,4)
pair2 <- c(1,3)
pair3 <- c(5,6)
pairedList <- c(pair1, pair2, pair3)
botList <- c(1:(length(pairedList)/2)



library(gtools)
test <- function(pairedList, botList) {


 #initialising empty list
 output <- list()

  for (i in botList) {
   x <- rep(0, length(pairedList))
   ind <- pairedList[i:(i+1)]
   ind.inv <- sort(ind, decreasing=T)
   val <- rep(1,length(ind))
   new.x <- vector(mode="numeric",length(x)+length(val))
   new.x <- new.x[-ind]
   new.x[ind] <- val
   prob <- new.x

   output[[i]] <- prob
   print(prob)

 }
 return(output)
}

奇怪错误的原因是botList被创建为长度为6而不是长度3.另外,如果要为函数中的列表赋值,则需要使用double [[]]而不是[]

一旦你从函数中删除了它们,就按照以下方式将它们整合在一起:

output <- test(pairedList, botList)
result <- do.call(rbind,output)