我的数据框看起来像这样:
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)
答案 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