我有一个由多个案例组成的数据集,这些案例被标记为 1 或 NA。我试图找出一种方法来为每种情况返回不是 NA 的最高编号邮票。
以下是一些示例数据:
PIN <- c("case1", "case2", "case3", "case4", "case5")
STAMP_1 <- c(1, 1, 1, 1, 1)
STAMP_2 <- c(NA, 1, 1, NA, 1)
STAMP_3 <- c(1, NA, 1, 1, NA)
STAMP_4 <- c(NA, NA, 1, 1, NA)
STAMP_5 <- c(1, NA, NA, 1, NA)
data <- data.frame(PIN, STAMP_1, STAMP_2, STAMP_3, STAMP_4, STAMP_5)
Run Code Online (Sandbox Code Playgroud)
我想找出一种方法来返回一个包含以下列的数据框:“case1”、“case2”、“case3”、“case4”、“case5”和“STAMP_5”、“STAMP_2”、“STAMP_4” ,“STAMP_5”,“STAMP_2”在这种情况下。
这是一个带有max.col,is.na和的方法names。max.col查找每行具有最大值的列。在这里,我们为其提供 的值is.na,即 TRUE 或 FALSE,并使用 ties.method="last" 获取最终的非 NA 值。该位置用于索引names(dat)。
data.frame(PIN=dat$PIN,
stamp=names(dat)[-1][max.col(!is.na(dat[-1]), ties.method="last")])
PIN stamp
1 case1 STAMP_5
2 case2 STAMP_2
3 case3 STAMP_4
4 case4 STAMP_5
5 case5 STAMP_2
Run Code Online (Sandbox Code Playgroud)
如果您有一整行带有 NA,max.col将返回该行的最终位置(无提示失败?)。返回 NA 而不是该位置的一种方法是使用 NA 和幂运算的技巧。在这里,我们apply遍历行并找到any具有至少一个非 NA 值的行返回 FALSE(或 0)的任何 NA 行。
data.frame(PIN=dat$PIN,
stamp=names(dat)[-1][
max.col(!is.na(dat[-1]), ties.method="last") * NA^!rowSums(!is.na(dat[-1]))])
Run Code Online (Sandbox Code Playgroud)
在弗兰克的建议下,我从 切换applyapply(dat[-1], 1, function(x) all(is.na(x)))到!rowSums(!is.na(dat[-1]))。这应该比apply.