我有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)]
但是这个没有用
答案 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
并不比上面的解决方案简单,只是在这里扩展选择。