将向量元素分配给矩阵

时间:2019-03-25 18:37:58

标签: r matrix sapply

我希望将vector元素分配给matrix。在我的示例中,我可以在my.fruit中购买10种水果。按照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 个答案:

答案 0 :(得分:2)

这可能会容易得多:

my.output <- matrix(0, ncol = 3, nrow = 10)
i <- cbind(purchase.order.row,purchase.order.col)
my.output[i] <- 1:5

答案 1 :(得分:-1)

os.path函数中使用__file__代替<<-,以便=知道将sapply分配给全局定义的变量,而不是内部函数。 / p>