назначить элементы вектора на матрицу - PullRequest
0 голосов
/ 25 марта 2019

Я хочу присвоить vector элементам matrix. В моем примере у меня есть 10 видов фруктов, доступных для покупки, в my.fruit. Образец из пяти кусочков фруктов приобретается в последовательности, показанной в sequence.of.purchased.item. Я хочу создать matrix, содержащий последовательность, в которой был куплен фрукт, как показано в desired.result.

Вот несколько длинное описание того, как desired.result построен. Вектор my.fruit по существу является именами строк matrix desired.result. Первая купленная слива была первым купленным фруктом. Порядковый номер 1 помещается в первый столбец пятой строки, строка представляет сливы. Вторая купленная слива была третьим купленным фруктом. Порядковый номер 3 помещен во второй столбец строки сливы. Первое купленное яблоко было вторым купленным фруктом. Итак, число 2 помещено в первый столбец первого ряда, представляющего яблоки. Четвертый кусок купленного фрукта был апельсином. Таким образом, 4 помещается в первый столбец второго ряда, ряд, представляющий апельсины. Десятый ряд представляет оливки, но оливки не были куплены. Точно так же не покупались вишня, персики, абрикосы, груши, грейпфрут или инжир. Таким образом, все их строки равны нулю в desired.result.

my.fruit <- c('apple', 'orange', 'cherry', 'peach', 'plum',
              'apricot', 'pear', 'grapefruit', 'fig', 'olive')

sequence.of.purchased.item <- c('plum', 'apple', 'plum', 'orange', 'plum')

desired.result <- matrix(c(
    2,    0,    0,
    4,    0,    0,
    0,    0,    0,
    0,    0,    0,
    1,    3,    5,
    0,    0,    0,
    0,    0,    0,
    0,    0,    0,
    0,    0,    0,
    0,    0,    0), ncol = 3, byrow = TRUE)

Я могу получить индексы строк и столбцов для каждого кусочка купленного фрукта, используя:

purchase.order.row <- match(sequence.of.purchased.item, my.fruit)
purchase.order.row
#[1] 5 1 5 2 5

purchase.order.col <- sapply(1:length(sequence.of.purchased.item), 
     function(i) {sum(sequence.of.purchased.item[i] == sequence.of.purchased.item[1:i])})
purchase.order.col
#[1] 1 1 2 1 3

Здесь я пытаюсь присвоить порядковый номер каждого купленного фрукта выводу matrix, используя sapply:

my.output <- matrix(0, ncol = 3, nrow = 10)

sapply(1:5, function(x) my.output[purchase.order.row[x], 
                                  purchase.order.col[x]] = x)

Однако оператор sapply не возвращает желаемый результат.

my.output
      [,1] [,2] [,3]
 [1,]    0    0    0
 [2,]    0    0    0
 [3,]    0    0    0
 [4,]    0    0    0
 [5,]    0    0    0
 [6,]    0    0    0
 [7,]    0    0    0
 [8,]    0    0    0
 [9,]    0    0    0
[10,]    0    0    0

Ответы [ 2 ]

2 голосов
/ 25 марта 2019

Это, вероятно, будет намного проще:

my.output <- matrix(0, ncol = 3, nrow = 10)
i <- cbind(purchase.order.row,purchase.order.col)
my.output[i] <- 1:5
0 голосов
/ 25 марта 2019

Используйте <<- вместо = внутри вашей функции sapply, чтобы sapply знал, как присвоить x глобальной переменной вместо внутренней функции.

...