2017-11-21 6 views
2

私はこのようなものに見えるのデータフレームがあります。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)

+0

を使用することができますか?私はあなたが何を意味するのか分からない。 – denis

+0

私は、提供された例の想定結果を追加しました。 – Lukas

+0

関連:[各行について、最大値の列名を返します](https://stackoverflow.com/questions/17735859/for-each-row-return-the - 最大値の列名/) – Henrik

答えて

2

あなたはmax.colあなたは出力が所望与える可能性

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

パーフェクト!魅力的な作品! – Lukas

1

一つの解決策は、長い形式に広いから再形成し、右端を選択することです行IDによって、すなわち、最後の列> 0:

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 
2

ここでは、applyを使って何ができるかです:あなただけのベクトルがしたいです。基本的には、apply内の関数はデータ> 0を行方向に検索し、最後のものを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" 
+0

ありがとうございます。これは動作しますが、0からなる行のみNAを返します。 Henrikのソリューションは単に最後の列を返すだけなので、私の目的にはより適しています。しかし私は私の質問でこれを指定しなかったので、あなたが知る方法はありません。ありがとう! – Lukas

関連する問題