简体   繁体   English

如何通过向量列表循环 function

[英]How to loop function through list of vectors

I have a list called x containing 8 vectors of different lengths, which I randomly generated like so:我有一个名为x的列表,其中包含 8 个不同长度的向量,我随机生成如下:

set.seed(1852020)

# specify how many vectors I want
N <- c(1:8)

# set up output
x <- vector("list", length(N))

# loop to generate binomial vectors of a random length between 1 and 50
for (i in N) {
  n <- sample(50, 1, replace = TRUE)
  x[[i]] <- rbinom(n, 1, .66)
}

x
[[1]]
[1] 1 1 1 1 1

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

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

[[4]]
[1] 1 1

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

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

[[7]]
[1] 1 1 1 1

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

I now want to feed each vector through a function I have written called learn :我现在想通过我写的名为learn的 function 提供每个向量:

learn <- function(prior, e){
  out <- ifelse(is.na(e), prior,
                ifelse(e == 1, (0.6*prior) / ((0.6*prior) + (1-0.6)*(1-prior)),
                       ((1-0.6)*prior) / (((1-0.6)*prior) + (0.6*(1-prior)))))
  out
}

How can I do this so that the prior argument of my function updates between each value from x is fed through as the e argument?我怎样才能做到这一点,以便我的 function 在x的每个值之间更新的prior参数作为e参数传递? For example, if I start with a prior of 0.5 and feed through x[[4]] , it should do this:例如,如果我从 0.5 的prior开始并通过x[[4]]进行馈送,它应该这样做:

> learn(0.5, 1)
[1] 0.6
> learn(0.6, 1)
[1] 0.6923077

My desired output would be a vector of 8 values corresponding to the 8 vectors contained in list x .我想要的 output 将是一个包含 8 个值的向量,对应于列表x中包含的 8 个向量。


If it is helpful, x can be turned into a dataframe like so:如果有帮助,可以将x转换为 dataframe ,如下所示:

f <- function(data) {
  nCol <- max(vapply(data, length, 0))
  data <- lapply(data, function(row) c(row, rep(NA, nCol-length(row))))
  data <- matrix(unlist(data), nrow=length(data), ncol=nCol, byrow=TRUE)
  data.frame(data)
}

x <- f(x)

> x
  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30 X31 X32 X33 X34 X35 X36 X37 X38 X39 X40 X41 X42 X43 X44 X45 X46 X47 X48
1  1  1  1  1  1 NA NA NA NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
2  1  1  1  0  0  1  1  0  1   0   1   0   1   1   1   1   1   1   1   1   0   1   1   0   1   0   0   1   0   1   0   0   0   0   0   1   0   0   1   0   1   0   1   0   0   1   1   1
3  0  1  1  0  0  1  0  1  1   1   1   1   1   1   1   0   1   0   1   1   0   1   0   1   0   1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
4  1  1 NA NA NA NA NA NA NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
5  1  1  1  1  0  0  0  1  1   0   1   1   0   0   1   1   0   1   1   0   1   1   1   1   0   1   1   0   1   1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
6  0  1  1  1  1  0  0  1  1   1   1   1   0   1   1  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
7  1  1  1  1 NA NA NA NA NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
8  1  1  1  0  0  0  1  1  1   0   0   1   0  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

Try to do this:尝试这样做:

test <- function(vec){
  prior <- 0.5
  for (i in vec){
    res <- learn(prior, i)
    prior <- res
  }
  return(prior)
}

results <- sapply(x, test)

Here I assume that for each vector the prior starts with is 0.5.在这里,我假设对于每个向量,先验以 0.5 开头。 Output: Output:

[1] 0.5000000 0.9885711 0.5000000 0.9885711 0.9948880 0.9624468 0.9746472 0.9447084

If instead you want that prior is also updated between vectors in the list do this:相反,如果您希望在列表中的向量之间也更新先验,请执行以下操作:

test <- function(vec, new_prior){
  for (i in vec){
    res <- learn(new_prior, i)
    new_prior <- res
  }
  return(new_prior)
}

prior <- 0.5
final_array <-  c()
for (l in x){
  result <-test(l, prior)
  final_array <- c(final_array, result)
  prior <- result
}
final_array

Output: Output:

[1] 0.5000000 0.9885711 0.9885711 0.9998664 0.9999993 1.0000000 1.0000000 1.0000000

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM