【问题标题】:Resorting columns to initial ordering after deletion of columns删除列后将列重新排序
【发布时间】:2018-01-19 17:18:05
【问题描述】:

笨拙的标题,但让我解释一下其中的内容:

我的初始矩阵如下所示:

kitty <- matrix(  
  c(1, 2, 4, 0, 0, 0, 0, 0, 0, 3, 1, 2), 
  nrow=3, 
  ncol=4)

返回:

X1 X2 X3 X4
1  0  0  3
2  0  0  1
4  0  0  2

我删除所有零列

kitty<- kitty[, colSums(kitty != 0) > 0]

因为我必须对产生的矩阵运行一组特定的计量经济学(这里是完整的随机数字集,重要的是第 2 列和第 3 列不再包含在其中,并且我的方法也不允许我命名列):

kitty2 <- matrix(  
  c(2, 3, 4, 1, 3, 8), 
  nrow=3, 
  ncol=2)

X1 X4
2  1
3  3
4  8

什么是有效的方法(我有数百个这样的矩阵)将列重置回其初始位置,用 NA 或 0 填充缺失的列?

X1 X2 X3 X4
2  NA NA  1
3  NA NA  3
4  NA NA  8

【问题讨论】:

  • kitty 不是使用列名创建的。您是否在示例代码中跳过了哪些步骤?
  • 我只是使用列名让读者清楚地知道保留了哪些列。在我的代码中,不允许使用列名。

标签: r matrix data-management


【解决方案1】:

坦率地说,我不太确定这是否特别有效,但这是我能想到的最佳方式:

获取kitty 的非零索引:

indices <- which(colSums(kitty != 0) > 0)

然后,一旦你有了kitty2,用你改变的列的值重新填充kitty

kitty[,indices] <- kitty2
kitty
         [,1] [,2] [,3] [,4]
   [1,]    2    0    0    1
   [2,]    3    0    0    3
   [3,]    4    0    0    8

然后您可以将列保留为零或将它们更改为NA

【讨论】:

  • for 循环本身并不邪恶,但考虑以“矢量化”模式思考:[,] 中的列索引支持 1 或更多 列,所以您可以使用kitty[,indices] 大大简化此操作。 (这实际上适用于array 中的任何维度,其中matrix 只是一个二维array。)
  • @r2evans 这是一种更清洁的方法!谢谢,我将编辑我的答案以反映
【解决方案2】:

您可以从一开始就分配NA,而不是尝试重新创建已删除的列吗?

kitty <- matrix(  
  c(1, 2, 4, 0, 0, 0, 0, 0, 0, 3, 1, 2), 
  nrow=3, 
  ncol=4)
kitty[,!(colSums(kitty) > 0)] <- NA
kitty
#      [,1] [,2] [,3] [,4]
# [1,]    1   NA   NA    3
# [2,]    2   NA   NA    1
# [3,]    4   NA   NA    2

【讨论】:

  • 谢谢,但不可能:我在矩阵上运行 prcomp,不允许数组中存在任何 NA
猜你喜欢
  • 2016-04-27
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2016-01-21
  • 2015-04-06
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多