R语言 返回每行中不是NA的最后一个数据框列的名称

7uzetpgm  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(144)

我有一个数据集,其中包含多个标记为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)

我想找出一种方法来返回一个将有列的数据框:“情况1”、“情况2”、“情况3”、“情况4”、“情况5”和“印章_5”、“印章_2”、“印章_4”、“印章_5”、“印章_2”。

vfhzx4xs

vfhzx4xs1#

下面是一个使用max.colis.nanames的方法。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

如果整行都有NA,max.col将返回该行的最终位置(是否为静默失败?)。返回NA而不是该位置的一种方法是使用NA和取幂的技巧。在这里,我们对所有行执行apply,并找到任何包含any行的NA行,如果这些行至少有一个非NA值,则返回FALSE(或0)。

data.frame(PIN=dat$PIN,
           stamp=names(dat)[-1][
                max.col(!is.na(dat[-1]), ties.method="last") * NA^!rowSums(!is.na(dat[-1]))])

在Frank的建议下,我从applyapply(dat[-1], 1, function(x) all(is.na(x)))切换到了!rowSums(!is.na(dat[-1]))。这应该比apply快很多。

xam8gpfp

xam8gpfp2#

通过将dplyrmelt一起使用(从reshape

dat=melt(dat)
dat=na.omit(dat)
dat%>%group_by(PIN)%>%slice(n())

# A tibble: 5 x 3
# Groups:   PIN [5]
     PIN variable value
  <fctr>   <fctr> <dbl>
1  case1  STAMP_5     1
2  case2  STAMP_2     1
3  case3  STAMP_4     1
4  case4  STAMP_5     1
5  case5  STAMP_2     1
mf98qq94

mf98qq943#

碱基R

temp = cbind(NA, data[-1])
temp = temp * col(temp)
data.frame(PIN = data$PIN,
           STAMP = names(temp)[max.col(m = replace(temp, is.na(temp), 0),
                                       ties.method = "first")])
#    PIN   STAMP
#1 case1 STAMP_5
#2 case2 STAMP_2
#3 case3 STAMP_4
#4 case4 STAMP_5
#5 case5 STAMP_2

相关问题