返回最大编号的数据帧列,该列不是NA

时间:2017-08-29 20:09:55

标签: r dataframe na

我有一个由多个案例组成的数据集,这些案例标记为1或NA。我试图找出一种方法来返回每个案例中不是NA的最高编号的邮票。

以下是一些示例数据:

checked radios

我想找出一种方法来返回一个包含列的数据框:" case1"," case2"," case3" ," case4"," case5" AND" STAMP_5"," STAMP_2"," STAMP_4"," STAMP_5"," STAMP_2"在这种情况下。

3 个答案:

答案 0 :(得分:4)

以下是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]))])

在弗兰克提出建议后,我从applyapply(dat[-1], 1, function(x) all(is.na(x)))切换到!rowSums(!is.na(dat[-1]))。这应该比apply快得多。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

基础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