将顺序排序分配给R中具有多个关系的数据

时间:2014-11-09 18:29:40

标签: r ranking

我试图按照数据框中的两个因素对计数进行排名。不过我想对这种关系进行特殊处理。如果两个值是等值的,我希望它们具有相等的平局值。但是,排名中的下一个值应该具有下一个整数排名。

当我得到唯一值的数据帧时,我被困住的地方就是因素种类。 (在我的实际数据集中,它取决于三个因素)。

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

2 个答案:

答案 0 :(得分:3)

使用当前形式的数据,您有两个问题,一个是R语法问题,另一个是“语义”问题。 @ARobertson提出了语法问题,他真的建议你将“count”列转换为character。这将阻止虚假<NA>的创建,但如果这不仅仅是一个玩具问题,将无法解决该怎么做的语义问题。如果这些计数值以字符值形式出现,则排序为字符将进行排序:1,10,11,12,...,19,2,20,21,....因此,在使用{转换因子后立即进行排序{1}},即使您使用dplyr :: dense_rank,也需要as.character步骤:

as.numeric

如果你真的希望这些是字符类,你可以在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) 函数调用周围包裹一个外部as.character(.)

答案 1 :(得分:1)

试试这个:

# 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]
  })