返回包含最大值的列的名称,仅来自data.frame中的某些列

我想获取(在data.table中的新列中)列的列名,该列的列名仅包含data.frame中的几列中的最大值.

这是一个示例data.frame

# creating the vectors then the data frame ------
id = c("a", "b", "c", "d")
 ignore = c(1000,1000, 1000, 1000) 
 s1 = c(0,0,0,100)
s2 = c(100,0,0,0)
s3 = c(0,0,50,0)
s4 = c(50,0,50,0)
 df1 <- data.frame(id,ignore,s1,s2,s3,s4)  

(1)现在我想从列s1-s4中找到每行中最大数字的列名. (即忽略名为“忽略”的列)

(2)如果最大值存在平局,我希望返回最后一个(例如s4)列名.

(3)作为额外的帮助 – 如果全部为0,我理想情况下NA会返回

到目前为止,这是我最好的尝试

df2 <- cbind(df1,do.call(rbind,apply(df1,1,function(x) {data.frame(max.col.name=names(df1)[which.max(x)],stringsAsFactors=FALSE)})))

这会在每种情况下返回ignore,并且(除了行b)在我删除此列时起作用,并将s1-s4列重新排序为s4-s1.

你会怎么做?

非常感谢.

最佳答案 我们使用grep为以’s’开头,后跟数字(‘i1’)的列创建列索引.要获取具有最大值的子集数据集(‘df1 [i1]’)的行索引,我们可以使用带有选项ties.method =’last’的max.col.要将只有0值的行转换为NA,我们得到rowSums,检查是否为0(== 0)并将它们转换为NA(NA ^)并乘以max.col输出.这可用于提取子集数据集的列名称.

i1 <- grep('^s\\d+', names(df1))
names(df1)[i1][max.col(df1[i1], 'last')*NA^(rowSums(df1[i1])==0)]
#[1] "s2" NA   "s4" "s1"
点赞