将向量元素分配给矩阵
assign vector elements to matrix
我希望将 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
在这里,我尝试使用 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
这可能会容易得多:
my.output <- matrix(0, ncol = 3, nrow = 10)
i <- cbind(purchase.order.row,purchase.order.col)
my.output[i] <- 1:5
在 sapply
函数中使用 <<-
而不是 =
以便 sapply
知道将 x
分配给全局定义的变量而不是函数内部.
我希望将 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
在这里,我尝试使用 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
这可能会容易得多:
my.output <- matrix(0, ncol = 3, nrow = 10)
i <- cbind(purchase.order.row,purchase.order.col)
my.output[i] <- 1:5
在 sapply
函数中使用 <<-
而不是 =
以便 sapply
知道将 x
分配给全局定义的变量而不是函数内部.