【问题标题】:How can I input successive different values from a single vector across the same position in multiple arrays arranged in a list in R?如何在 R 中的列表中排列的多个数组中的相同位置从单个向量输入连续的不同值?
【发布时间】:2019-06-19 17:23:35
【问题描述】:

我已将大量数组排列到一个列表中,并且我有一个长度与具有不同值的数组数量相同的向量。对于列表中的每个数组,我想将向量中的连续特定值输入到列表中连续数组中的相同位置。

例如,如果我在一个列表中有 10 个 5x3x10 的数组,并且一个长度为 10 的向量具有 10 个不同的值,我希望向量的第一个值进入位置 [1,1, 1],向量的第二个值进入第二个数组的位置 [1,1,1],向量的第三个值进入第三个数组的位置 [1,1,1],依此类推到进入位置 [1,1,1] 的第十个数组的向量的第十个值。

这是我当前的代码(简化)。 根据需要提供所有变量/数组。 目前我有一个尝试执行此操作的函数,但其​​编写方式不允许将变量的连续值放入连续数组中。相反,该函数尝试将变量的所有值放入每个数组的位置 [1,1,1] 中,因此返回错误。

#Starting variables 

dt = 1

person_id <- c("a", "b", "c", "d", "e")
clinic_id <- c("c1", "c2", "c3")
time_id <- seq(2008.5, 2017.5, by = dt)

first <- c(13,14,10,8,6,8,7,9,10,12)
second <- c(16,8,9,4,5,6,2,3,4,5)
numbers <- data.frame(first,second)

dims <- list(person = person_id,
             clinic = clinic_id,
             time = time_id)   

#Create 10 arrays 

for (i in 1:10) {

assign(paste("modarrays", i, sep=""), 
     array(NA, lengths(dims), dims) )
}

#Creating array list with 10 arrays

modarraysall <- lapply(ls(pattern="modarrays"),get)
arraynames <- sapply(ls(pattern="modarrays"),as.name)
names(modarraysall) <- arraynames


#Initial values in array 

initval <- function(x){

 x[,,1] <- 0.0
 x <- x

 }

 modarraysallnew <- lapply(modarraysall, initval)


 #Values from vector of dataframe into array 
 #This is where it all goes wrong. 

 numbersintoarray <- function(x){

     x[1,1,1] <- numbers$first
       x <- x

 }

 modarraysallnew <- lapply(modarraysallnew, numbersintoarray)

这个函数实现没有输出,因为我收到一个错误提示

x[1, 1, 1]

我想我知道出了什么问题。此函数希望将 numbers$first 的值放入列表中每个数组的 [1,1,1] 位置。但是,numbers$first 的长度为 10 个值,其中每个数组中的位置 [1,1,1] 只有一个位置。因此,我知道这个函数是错误的。但是我如何编写一个函数,该函数从 numbers$first 中获取每个连续值并将其放入列表中位置 [1,1,1] 的每个连续数组中。

下面我展示了我希望数组之后的样子。

modarrays1[,,1] 

        clinic
person      c1     c2        c3 
 a          13     0         0
 b          0      0         0
 c          0      0         0
 d          0      0         0
 e          0      0         0



modarrays1[,,2] 

        clinic
person      c1     c2        c3 
 a          14     0         0
 b          0      0         0
 c          0      0         0
 d          0      0         0
 e          0      0         0



modarrays1[,,3] 

        clinic
person      c1     c2        c3 
 a          10     0         0
 b          0      0         0
 c          0      0         0
 d          0      0         0
 e          0      0         0



....

modarrays10[,,1] 

        clinic
person      c1     c2        c3 
 a          12     0         0
 b          0      0         0
 c          0      0         0
 d          0      0         0
 e          0      0         0

我意识到我可以一次写出一个数组。但是,在我的实际模型代码中,列表中有 54 个数组,因此希望能够编写一个函数来代替。

【问题讨论】:

  • length(modarraysallnew[[1]][1,1,1]) 是 1 而 length(numbers$first) 是 10。这就是它无法分配的原因。您需要并行循环 numbers$firstmodarraysallnew

标签: arrays r list function


【解决方案1】:

如果您想在两个不同的列表或向量中按元素执行函数,最好的办法是使用mapplyMap。他们需要一个函数,该函数接受与您提供的列表/向量一样多的参数。所以在你的情况下,你可以尝试:

numbersintoarray <- function(arr, val) {
    arr[1, 1, 1] <- val
    return(arr)
}

m <- Map(numbersintoarray, modarraysallnew, numbers$first)

m$modarrays1[ , , 1]
#       clinic
# person c1 c2 c3
#      a 13  0  0
#      b  0  0  0
#      c  0  0  0
#      d  0  0  0
#      e  0  0  0

【讨论】:

    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多