2017-09-13 10 views
3

我有df包括NA。以min值(包含NA)呼叫col名稱

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)] 

但是這一次沒有工作

+0

如果我的解決方案有助於解決問題,您可以接受它 – PoGibas

回答

2

你不需要吶。當使用which.min()時rm = TRUE - 試試這個:

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

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/17323257) –

2

這裏有一個想法,很可能會更快,不需要任何的循環。您可以用Inf替換NA,取數據的負值,然後通過max.col()找到每列的最大值。

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

而且,不要忘記,一個data.table的解決方案,因爲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 

除上述解決方案不要太簡單了,只是在這裏擴展選擇。