【问题标题】:getting occurrence of values according to a condition根据条件获取值的出现
【发布时间】:2014-01-24 09:59:50
【问题描述】:

在发布此问题之前,我已经在几个问题中搜索了类似的内容,但我无法找到我要查找的内容。 如果这篇文章是重复的,那么我很抱歉,如果你能把正确的问题转发给我,我将不胜感激。

我有以下数据:

data<-data.frame(a=c(0:10),b=c(5:15),c=c(10:20),d=c(1:5,15:20))

我“只是”希望获得具有最大值的行的列名。我完成了这项任务

names(data)[apply(data,1,which.max)]

实际上,由于有两列 (c & d[6:10]) 符合最大值的条件,我真正想要得到的是这样的:

result<-c("c","c","c","c","c","double","double","double","double","double")

因此,由于 which.max 的行为只允许(至少在我看来)只获取第一个元素,我想出了一个非常复杂的解决方案。 查找每行的重复元素,然后,如果这些索引中的任何一个与 which.max 代码中的索引匹配,则将其更改为“double”。或多或少是这样的:

index<-t(apply(data,1,function (x) duplicated(x,fromLast=TRUE)))
colnames(index)<-colnames(data)

再次感谢任何提示!

【问题讨论】:

    标签: r max find-occurrences


    【解决方案1】:

    您可以通过直接使用whicharr.ind 参数来简化您的方法。

    data <- data.frame(a = c(0:10), b = c(5:15), c = c(10:20), d = c(1:5, 15:20))
    ind <- which(data == max(data), arr.ind = TRUE)
    ind
    ##      row col
    ## [1,]  11   3
    ## [2,]  11   4
    
    names(data)[ind[,2]]
    ## [1] "c" "d"
    

    编辑

    每行都有相同的结果

    lapply(apply(data, 1, function(x) which(x == max(x), arr.ind = TRUE)), names)
    ## [[1]]
    ## [1] "c"
    
    ## [[2]]
    ## [1] "c"
    
    ## [[3]]
    ## [1] "c"
    
    ## [[4]]
    ## [1] "c"
    
    ## [[5]]
    ## [1] "c"
    
    ## [[6]]
    ## [1] "c" "d"
    
    ## [[7]]
    ## [1] "c" "d"
    
    ## [[8]]
    ## [1] "c" "d"
    
    ## [[9]]
    ## [1] "c" "d"
    
    ## [[10]]
    ## [1] "c" "d"
    
    ## [[11]]
    ## [1] "c" "d"
    

    【讨论】:

    • 嗯,不幸的是,通过这种方式,我似乎获得了所有数据的最大值索引,而不仅仅是行。无论如何,谢谢你的建议!
    • 这正是我想要的!非常感谢您的帮助,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多