我试图按照数据框中的两个因素对计数进行排名。不过我想对这种关系进行特殊处理。如果两个值是等值的,我希望它们具有相等的平局值。但是,排名中的下一个值应该具有下一个整数排名。
当我得到唯一值的数据帧时,我被困住的地方就是因素种类。 (在我的实际数据集中,它取决于三个因素)。
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
答案 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]
})