【问题标题】:How to move up the values of each column in a matrix in R如何在R中的矩阵中上移每一列的值
【发布时间】:2019-10-17 13:02:06
【问题描述】:

我正在寻找一种通用方法来执行以下操作, 我有一个nxn的三角矩阵,例如:

a NA NA
b  d NA
c  e f

并将其转换为:

a d f
b e NA
c NA NA

想法是:为每一列移动值,直到第一个非 NA 值在第一行

我想它是用for来完成的,对于每一列,让它上升,但我不知道如何使它......

【问题讨论】:

  • 对这个“上涨”进行更准确的描述是个好主意。第一列移动一个位置,而第二列移动两个。是关于转移到第一个非 NA 值吗?
  • 对不起,我会编辑我的问题,是的,就是这样

标签: r matrix triangular


【解决方案1】:

编辑:将其修复为不对值进行排序:

apply(m, 2, function(x) x[order(is.na(x))])

原文:另一种使用sort(..., na.last = T) 的解决方案,如果您需要对每一列进行排序则很好:

m <- structure(c("a", "b", "c", NA, "d", "e", NA, NA, "f"), .Dim = c(3L, 
                                                                     3L), .Dimnames = list(NULL, c("V1", "V2", "V3")))

apply(m, 2, sort, na.last = T )

     V1  V2  V3 
[1,] "a" "d" "f"
[2,] "b" "e" NA 
[3,] "c" NA  NA 

【讨论】:

  • 通过排序,您正在更改它们出现的顺序。虽然我不太确定这是否是一个问题
  • 这不是想要的输出吗?至少,它匹配 OP 的第二张表。但是,我同意当时我不想更改顺序,如果列行顺序无关紧要,为什么还要使用矩阵?
  • 这种情况下它是匹配的,因为 d
  • 哦,我明白了。是啊,你说得对。我将进行编辑或删除。
  • 感谢您指出。我修复了它以排序它是否为 NA。这不应该改变顺序。
【解决方案2】:

这是一种使用自定义函数的方法 -

m <- structure(c("a", "b", "c", NA, "d", "e", NA, NA, "f"), .Dim = c(3L, 
3L), .Dimnames = list(NULL, c("V1", "V2", "V3")))

custom_shift <- function(x) {
  y <- x[!is.na(x)]
  length(y) <- length(x)
  y
}

apply(m, 2, function(a) custom_shift(a))

     V1  V2  V3 
[1,] "a" "d" "f"
[2,] "b" "e" NA 
[3,] "c" NA  NA 

【讨论】:

  • 但我只有矩阵,没有向量
  • 在我的解决方案中,输入m 和输出都是矩阵。我没有使用任何向量。只需运行代码并告诉我。
  • 我找到了,谢谢 :) stackoverflow.com/questions/3823211/…
猜你喜欢
  • 2014-07-31
  • 2019-01-27
  • 2014-03-15
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
相关资源
最近更新 更多