R 使用最小值调用列名称(包括NA)
我有一个女儿R 使用最小值调用列名称(包括NA),r,R,我有一个女儿 df <- data.frame( X1= c(NA, 1, 4, NA), X2 = c(34, 75, 1, 4), X3= c(2,9,3,5)) 我试过了 df$Min <- colnames(df)[apply(df,1,which.min, na.rm=TRUE)] df$Min使用which.Min()时不需要na.rm=TRUE–请尝试以下方法: df$Min <- colnames(d
df <- data.frame( X1= c(NA, 1, 4, NA),
X2 = c(34, 75, 1, 4),
X3= c(2,9,3,5))
我试过了
df$Min <- colnames(df)[apply(df,1,which.min, na.rm=TRUE)]
df$Min使用which.Min()时不需要na.rm=TRUE–请尝试以下方法:
df$Min <- colnames(df)[apply(df,1,which.min)]
代码:
这里有一个想法,可能会更快,不需要任何循环。您可以将NA
替换为Inf
,取数据的负数,然后通过max.col()
查找每列的最大值
另外,不要忘记,一个data.table
解决方案,如果我的解决方案有助于解决问题,您可以接受它
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
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
names(df)[max.col(-replace(df, is.na(df), Inf))]
# [1] "X3" "X1" "X2" "X2"
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