R:找到满足数据帧每一行的特定条件的最后一个值的位置

时间:2017-11-21 14:53:25

标签: r

我的数据框看起来像这样:

M0 M1  M2  M3  M4  M5  M6  M7  M8
1   1   0   0   0   NA  NA  NA  NA
2   2   2   2   2   2   2   0   0
2   2   2   2   2   0   NA  NA  NA
2   2   2   2   2   0   0   0   0

我想知道的是每行中最后一个值大于0的位置(列)。

所需的输出将是包含这些索引位置的向量

这里:(M1,M6,M4,M4)

3 个答案:

答案 0 :(得分:2)

以下是使用apply可以执行的操作。基本上,apply中的函数查找数据> 0 rowwise,使用tail(x,1)找到最后一个,并找到相应的列名。

df <- read.table(text="M0 M1  M2  M3  M4  M5  M6  M7  M8
1   1   0   0   0   NA  NA  NA  NA
                 2   2   2   2   2   2   2   0   0
                 2   2   2   2   2   0   NA  NA  NA
                 2   2   2   2   2   0   0   0   0",header=TRUE, stringsAsFactors=FALSE)

names(df)[apply(df, 1, function(x) tail(which(x > 0), 1))] 

[1] "M1" "M6" "M4" "M4"

答案 1 :(得分:2)

您可以使用max.col

names(df)[max.col(!is.na(df) & df > 0, ties.method = "last")]
# [1] "M1" "M6" "M4" "M4"

答案 2 :(得分:1)

一种解决方案是从宽格式转换为长格式并选择最右边的,即最后一列&gt; 0 by row id:

library(data.table)
melt(setDT(DF)[, rn := .I], id.vars = "rn", na.rm = TRUE)[
  value > 0, last(variable), by = rn]
      rn     V1
1:     1     M1
2:     2     M6
3:     3     M4
4:     4     M4

如果您只想要矢量:

melt(setDT(DF)[, rn := .I], id.vars = "rn", na.rm = TRUE)[
  value > 0, last(variable), by = rn][, V1]
[1] M1 M6 M4 M4
Levels: M0 M1 M2 M3 M4 M5 M6 M7 M8