【发布时间】:2021-01-09 04:19:19
【问题描述】:
我有一个 3 列的矩阵。对于每一行,都要选择一个非缺失值,-如果在第1列中没有找到值,则搜索第2列,然后搜索第3列,并由用户给出顺序。
我对我复杂的嵌套 ifelse 方法感到相当满意 - 唉,这取决于给定列的相同长度。但是列的数量应该是灵活的(因此嵌套的 ifelse 语句的数量是灵活的) - 意思是,如果用户只选择一或两列,即使不想要的列包含一个值,也会产生 NA。
foo_mat <- structure(c(
NA, 30L, 15, 0, NA, 100L, 87L, NA, 0, NA, 2L, NA,
10, 0, NA
), .Dim = c(5L, 3L), .Dimnames = list(NULL, c(
"a", "b", "c"
)))
foo <- function(x, preced) {
ifelse(!is.na(x[, preced[1]]), x[, preced[1]],
ifelse(!is.na(x[, preced[2]]), x[, preced[2]],
x[, preced[3]]
)
)
}
foo_mat
#> a b c
#> [1,] NA 100 2
#> [2,] 30 87 NA
#> [3,] 15 NA 10
#> [4,] 0 0 0
#> [5,] NA NA NA
foo(foo_mat, c("a", "c", "b"))
#> [1] 2 30 15 0 NA
foo(foo_mat, preced = c("b", "a"))
#> Error in x[, preced[3]]: subscript out of bounds #(of course)
# desired output
#> [1] 100 87 15 0 NA
【问题讨论】:
-
您的示例数据是一个好的开始,但缺少最后一部分。我认为它需要添加
"b", "c"))),对吗? -
我的错,谢谢你看到它......但我的鼠标拖动复制/粘贴没有抓住它,所以无论如何一起编辑它可能很有用。谢谢,打扰了。
标签: r