分配顺序的行列,与R中多关系数据(assigning sequential ranks to dat

2019-10-21 06:23发布

我试图排名计数,通过在数据帧有两个因素制约。 不过,我想有关系的特殊待遇。 如果两个值equaly,我希望他们能有一个平等的领带值。 然而,在排名的下一个值应该有下一个整数等级。

当我坚持的是当我有获得唯一值的数据帧,在种因素条件。 (在我的实际数据集,它是三个因素的条件)。

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

Answer 1:

在目前的形式你的数据,你有两个问题,其中一个是R语法的关注和另一种是“语义”的担忧。 句法关注已经由@ARobertson谁是真的建议你转换的“计数”列字符提高。 这将防止虚假创建<NA>的,但不会解决什么就做什么,如果这不仅仅是一个玩具问题多语义问题。 如果这些计数值来作为字符值进行排序,然后按字符将使得顺序:1,10,11,12,...,19,2,20,21,...与转换因素后,所以立刻as.character ,你还需要一个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)

如果你真的想这些是字符类你可以用外as.character(.)周围的ave函数调用。



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


文章来源: assigning sequential ranks to data with multiple ties in R
标签: r ranking