【问题标题】:assigning sequential ranks to data with multiple ties in R将顺序等级分配给R中具有多个关系的数据
【发布时间】:2014-11-09 18:29:40
【问题描述】:

我正在尝试对计数进行排名,这取决于数据框中的两个因素。但是,我想对关系进行特殊处理。如果两个值相等,我希望它们具有相等的平局值。但是,排名中的下一个值应该具有下一个整数排名。

当我获得唯一值的数据框时,我遇到了困难,条件是因子种类。 (在我的实际数据集中,它取决于三个因素)。

species <- c(rep("a", 3), rep("b", 4))
df <- data.frame(species, count = c("1", "1", "5", "1", "3", "3", "4"))

df$rank <- ave(df$count, df$species, FUN = rank)#doesnt get the output i'd like

#desired output
df$rank.good <- c("1", "1", "2", "1", "2", "2", "3")
df

【问题讨论】:

  • 我不确定我是否理解您想要的输出,因为df.3NA 列为其中之一。也许您需要 dplyr 包中的 dense_rank 函数?
  • 只是想澄清一下,对不起,我以为我已经让代码的第一部分工作了。我认为dense_rank 就是我要找的!

标签: r ranking


【解决方案1】:

对于当前形式的数据,您有两个问题,一个是 R 语法问题,另一个是“语义”问题。 @ARobertson 提出了语法问题,他确实建议您将“计数”列转换为字符。这将防止创建虚假的&lt;NA&gt;,但不会解决如果这不仅仅是一个玩具问题该做什么的语义问题。如果这些计数值以字符值的形式出现,那么按字符排序将进行排序:1,10,11,12,...,19,2,20,21, .... 所以在使用 @ 转换因子之后立即987654322@,你还需要一个as.numeric 步骤,即使你使用 dplyr::dense_rank:

dense_rank <-   # copied from pkg::dplyr
 function (x) 
 {   r <- rank(x)
     match(r, sort(unique(r)))
 }
df$rank.good <- ave(as.numeric(as.character(df$count)), df$species, FUN = dense_rank)

如果您真的希望这些是字符类,您可以在 ave 函数调用周围包裹一个外部 as.character(.)

【讨论】:

  • 很抱歉同时编辑。 dense_rank 函数更加简洁。
  • 你的回答和plyr::dense_rank 都不能解决字符值排序的问题,除非词法排序是提问者心中的目标。如果这些是“计数”,他似乎很可能没想到12 会小于2
【解决方案2】:

试试这个:

# added more tests that are not sequential and fixed up data.frame
species <- c(rep("a", 3), rep("b", 4),rep("c",10))
df <- data.frame(species, count = c("1", "1", "5", "1", "3", "3", "4",'1','7','3','3','7','2','10','3','11','2'),stringsAsFactors = F)
df$count <- as.numeric(df$count)

# solution
df$rank <- ave(df$count, df$species, FUN = function(x){
  r <- rank(x,ties.method = 'min')
  as.numeric(factor(rank(sort(r))))[r]
  })

【讨论】:

  • 行得通!我很困惑为什么这以前不起作用:df$rank.min &lt;- ave(df$count, df$species, FUN=rank, ties.method="min")
  • 我不相信 ave() 有一个 ...= 像大多数 *apply 系列一样的参数,它可以让你传递额外的参数。 ties.method 被静默忽略,而是使用默认的“平均值”。
猜你喜欢
  • 2014-10-09
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多