r - 在 R 中创建多个计数器的矩阵

标签 r counter apply

所以,我的目标是获取输入向量并生成不同计数器的输出矩阵。因此,每次输入中出现一个值时,我都想找到该计数器并将其迭代 1。我知道我不擅长解释这一点,所以我在下面展示了一个简单的版本。但是,我想进行 2 项更改,我将在示例之后列举这些更改,以便它有意义。

nums = c(1,2,3,4,5,1,2,4,3,5)
unis = unique(nums)
counter = matrix(NA, nrow = length(nums), ncol = length(unis))
colnames(counter) = unis
for (i in 1:length(nums)){
  temp = nums[i]
  if (i == 1){
    counter[1,] = 0
    counter[1,temp] = 1
  } else {
    counter[i,] = counter[i-1,]
    counter[i,temp] = counter[i-1,temp]+1
  }
}
counter

输出

 > counter
      1 2 3 4 5
 [1,] 1 0 0 0 0
 [2,] 1 1 0 0 0
 [3,] 1 1 1 0 0
 [4,] 1 1 1 1 0
 [5,] 1 1 1 1 1
 [6,] 2 1 1 1 1
 [7,] 2 2 1 1 1
 [8,] 2 2 1 2 1
 [9,] 2 2 2 2 1
[10,] 2 2 2 2 2

2处修改。 1)由于真实数据要大得多,我想使用 apply 来完成此操作,或者比我更了解 R 的人说应该这样做。 2)虽然输入是一个向量,其中每个元素只是一个元素,但如果向量的元素是一个元组,这如何概括?例如(如果 nums 是 4 和 5 的元组,那么它将在该步骤中迭代,并且输出的最后一行将是 2,2,2,3,2)

谢谢,如果您不明白,请提问,我会尽力澄清

最佳答案

使用Matrix包(随R标准安装一起提供)

nums <- c(1,2,3,4,5,1,2,4,3,5)
apply(Matrix::sparseMatrix(i=seq_along(nums), j=nums), 2, cumsum)
#      [,1] [,2] [,3] [,4] [,5]
#  [1,]    1    0    0    0    0
#  [2,]    1    1    0    0    0
#  [3,]    1    1    1    0    0
#  [4,]    1    1    1    1    0
#  [5,]    1    1    1    1    1
#  [7,]    2    2    1    1    1
#  [8,]    2    2    1    2    1
#  [9,]    2    2    2    2    1
# [10,]    2    2    2    2    2

请注意,这在一些方面与 thelatemail 建议的解决方案略有不同。您喜欢哪种行为取决于您使用它的目的。

这是一个说明差异的小示例:

nums <- c(5,2,1,1)

# My suggestion
apply(Matrix::sparseMatrix(i=seq_along(nums), j=nums), 2, cumsum)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    0    0    0    1
# [2,]    0    1    0    0    1
# [3,]    1    1    0    0    1
# [4,]    2    1    0    0    1

# @thelatemail's suggestion
sapply(unique(nums), function(x) cumsum(nums==x) )
#      [,1] [,2] [,3]
# [1,]    1    0    0
# [2,]    1    1    0
# [3,]    1    1    1
# [4,]    1    1    2

对于你的第二个问题,你可以这样做:

nums <- list(1,2,3,4,5,1,2,4,3,c(4,5))

ii <- rep(seq_along(nums), times=lengths(nums)) ## lengths() is in R>=3.2.0
jj <- unlist(nums)
apply(Matrix::sparseMatrix(i=ii, j=jj), 2, cumsum)
#       [,1] [,2] [,3] [,4] [,5]
#  [1,]    1    0    0    0    0
#  [2,]    1    1    0    0    0
#  [3,]    1    1    1    0    0
#  [4,]    1    1    1    1    0
#  [5,]    1    1    1    1    1
#  [6,]    2    1    1    1    1
#  [7,]    2    2    1    1    1
#  [8,]    2    2    1    2    1
#  [9,]    2    2    2    2    1
# [10,]    2    2    2    3    2

关于r - 在 R 中创建多个计数器的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30338668/

相关文章:

R cbind xts 对象导致添加/重复行

r - tidyr 扩展函数在期望紧凑向量时生成稀疏矩阵

python - 计算数据框中每一行和特定列在列表中的出现次数

r - 按字母顺序排列行

R - POST 的 JSON 结构

c++ - 使用数据文件排序计算时遇到问题

python - 计算字符串内列表中的子字符串

R data.table 使用任何划分列集和标志

dart - 如何在Dart中将参数从一个函数批量移动到另一个函数?

r - 如何在 R/RStudio 中安装 "developer mode"中的包?