【发布时间】:2017-08-15 12:00:08
【问题描述】:
我有数据框“Category”、“ID”、“Score(t)”,我想得到“Rank(t)”:
Category ID Score.08.2007 Score.09.2007 Rank.08.2007 Rank.09.2007 ...
Orange FSGBR070N3 0.16 ... 5 ...
Orange FSGBR070N3 0.05 ... 7 ...
Orange FSGBR070N3 0.11 6
Orange FS00008L4G 0.28 1
Orange FS00008VLD 0.27 2
Orange FS00008VLD 0.27 2
Orange FS00008VLD 0.27 2
Orange FS00009SQX -2.03 8
Orange FS00009SQX NA
Orange FSUSA0A1KW NA
Orange FSUSA0A1KW NA
Orange FSUSA0A1KX NA
Orange FSUSA0A1KY NA
Orange FS0000B389 NA
Banana FS000092GP 96.25 1
Banana FS000092GP 96.25 1
Banana FS000092GP 96.25 1
Banana FS000092GP 52.33 4
Banana FS0000ATLN 31.73 5
Banana FSUSA0AVMF 1.38 7
Banana FSGBR058O8 1.37 8
Banana FSGBR05845 2.24 6
排名基于每个“类别”中“分数”的降序排列。我很难捕捉到的附加规范是,当有相同的分数和相同的 ID 时,对于具有不同值的以下分数,分配的排名等于前一个 ID 的排名加上共享相同的 ID 的数量分数(示例中的排名输出列应该清楚地说明这一点)。
NA 不应该获得排名:
na.last = NA
我已经开始为排名创建一个矩阵,然后我可能需要 sort(),但我很难在时间序列和附加规范中捕捉到这一点......也找不到这样具体的现有问题.感谢您的帮助!
time_series <- c("08.2007","09.2007","10.2007",...)
abs_ranks_mat <- as.data.frame(mat.or.vec(nrow(ID),length(time_series)))
【问题讨论】:
-
我假设
t这里代表时间? data.frame 中的t在哪里?一般来说,如果您提供data.frame,我们可以将其复制粘贴到 R 中,帮助您会容易得多。 -
是的,
t代表时间(月)。它位于相应的列标题中,但我还创建了一个时间序列向量,希望这可以使它更容易。我不确定如何为此提供data.frame,它是如何工作的? -
我明白了。似乎
baseR 中的rank函数应用于您的每个score列可能已经让您走得很远,结合dplyr::group_by(df, Category)。