2017-09-13 4 views
3

私はNAを含むDFを持っています。コールコル名(NAが含まれています)

df <- data.frame(X1= c(NA, 1, 4, NA), 
      X2 = c(34, 75, 1, 4), 
      X3= c(2,9,3,5)) 

私の理想的なアウト

X1 X2 X3 Min 
1 NA 34 2 X3 
2 1 75 9 X1 
3 4 1 3 X2 
4 NA 4 5 X2 

、のようなルックスを来る私は

df$Min <- colnames(df)[apply(df,1,which.min, na.rm=TRUE)] 

を試してみましたが、この1つは

+0

私の解決策は、あなたがこの質問への答えを提供していません – PoGibas

答えて

2

を動作しませんでしたあなたはナ必要はありません。 RM = TRUE which.minを使用して() - 代わりにこれを試してみてください。

df$Min <- colnames(df)[apply(df,1,which.min)] 

出力:

X1 X2 X3 Min 
1 NA 34 2 X3 
2 1 75 9 X1 
3 4 1 3 X2 
4 NA 4 5 X2 
2

コード:

foo <- names(df) 
df$Min <- apply(df, 1, function(x) foo[which.min(x)]) 
df 

出力:

X1 X2 X3 Min 
1 NA 34 2 X3 
2 1 75 9 X1 
3 4 1 3 X2 
4 NA 4 5 X2 
+0

それを受け入れることができ、問題を解決するために助けた場合。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - (/レビュー/低品質・ポスト/ 17323257)[口コミより] –

2

ここではそう速くなりますし、任意のループを必要としないという考えです。その後、max.col()を介してカラムごとの最大値を見つけ、データの負を取る、InfNAを置き換えることができます。また

names(df)[max.col(-replace(df, is.na(df), Inf))] 
# [1] "X3" "X1" "X2" "X2" 
1

、ちょうどここの選択肢を拡張する上記のソリューションよりもdt <- as.data.table(df)

dt[ , Min:=names(dt)[match(min(.SD, na.rm=T), .SD)], by=1:nrow(dt)][] 
# X1 X2 X3 Min 
#1: NA 34 2 X3 
#2: 1 75 9 X1 
#3: 4 1 3 X2 
#4: NA 4 5 X2 

はるかに簡単ないことを考えるとdata.tableソリューションを、忘れていません。

関連する問題