Как я могу ввести последовательно различные значения из одного вектора в одну и ту же позицию в нескольких массивах, расположенных в списке в R? - PullRequest
0 голосов
/ 25 января 2019

Я упорядочил большое количество массивов в списке, и у меня есть вектор, длина которого равна числу массивов с разными значениями. Для каждого массива в списке я хотел бы ввести последовательные конкретные значения в векторе в одну и ту же позицию в последовательных массивах в списке.

Например, если бы в списке было 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] <- числа $ first: количество заменяемых элементов не кратно длине замены </p>

Я думаю, я знаю, что не так. Эта функция хочет поместить значение чисел $ first в позицию [1,1,1] каждого массива в списке. Однако числа $ first - это длина из 10 значений, где позиция [1,1,1] в каждом массиве - только одна позиция. Поэтому я знаю, что эта функция неправильная. Но как мне написать функцию, которая берет каждое последующее значение из числа $ 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 массива в списке, поэтому я хотел бы иметь возможность написать функцию для этого вместо этого.

1 Ответ

0 голосов
/ 26 января 2019

Если вы хотите выполнять функцию поэлементно в двух разных списках или векторах, лучше всего использовать mapply или Map.Им нужна функция, которая принимает столько аргументов, сколько вы предоставляете списков / векторов.Так что в вашем случае вы можете попробовать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...