使用最小值调用列名称(包括NA)

时间:2017-09-13 17:44:03

标签: r

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

但是这个没有用

4 个答案:

答案 0 :(得分:2)

使用which.min()时,你不需要na.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

答案 1 :(得分: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

答案 2 :(得分:2)

这个想法可能更快,不需要任何循环。您可以将NA替换为Inf,取消数据,然后通过max.col()找到每列的最大值。

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

答案 3 :(得分: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

并不比上面的解决方案简单,只是在这里扩展选择。

相关问题