【问题标题】:assign vector elements to matrix将向量元素分配给矩阵
【发布时间】:2019-08-16 02:04:42
【问题描述】:

我希望将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

这里我尝试使用sapply将每个购买的水果的序列号分配给输出matrix

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

【问题讨论】:

  • sapply 中的函数在其自己的本地环境中运行,而不会在全局环境中更改 my.output。您可以通过使用&lt;&lt;- 而不是= 来强制它在全局环境中运行。
  • @AndrewGustar 谢谢。很有帮助。
  • @AndrewGustar 使用某种形式的矩阵索引可能比使用&lt;&lt;- 和 sapply 更干净。

标签: r matrix sapply


【解决方案1】:

这可能会容易得多:

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

【讨论】:

    【解决方案2】:

    在您的sapply 函数中使用&lt;&lt;- 而不是=,以便sapply 知道将x 分配给全局定义的变量而不是函数内部。

    【讨论】:

    • 谢谢。我没有对你投反对票。我怀疑您的答案被否决了,因为它与上面评论中已经建议的解决方案相匹配。
    • 我明白了。不用担心。我之前没有检查 cmets。
    猜你喜欢
    • 2013-02-05
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多