按ID返回排名

时间:2019-01-17 20:20:55

标签: r

在包含两列Year和Value的数据框列表上。我已按年份按升序对值进行了排序。现在,我想返回每个值在他的年度系列中的位置以对其进行绘制,并在数据框中比较这些排名的年度系列。

这是数据集的一个例子

#data
df1 <- data.frame(Year = c(1860, 1860, 1860, 1861, 1861, 1862, 1862, 1862), Value = c(487, 456, 123, 159, 123, 789, 456, 321)) 
df2 <- data.frame(Year = c(1916, 1916, 1917, 1917, 1917, 1918, 1918, 1918, 1919, 1919), Value = c(123, 456, 487, 123, 159, 321, 789, 456, 487, 154)) 
l <- list(df1, df2)

第一步:我已经在order()函数中使用简单的lapply按年份对值进行了排序

sort.df <- lapply(l, function(x) {
x[order(x$"Year", x$"Value"), ]
})

Step2:我当时想使用带有循环的cbind()数字值序列

for (row in 1:nrow(df)) {
require (dplyr)
require (purr)
df %>% group_by(df$"Year") %>%
seq(1, (as.numeric(nrow(df[which(df$Year == i), ]))), 1)
}

我根本无法将其集成到lapply()函数中……但是它适用于给定df的给定年份。

有没有办法做到这一点?

#result
df1.1 <- data.frame(Year = c(1860, 1860, 1860, 1861, 1861, 1862, 1862, 1862), Value = c(123, 456, 487, 123, 159, 321, 456, 789), Rank = c(1,2,3,1,2,1,2,3)) 
df2.1 <- data.frame(Year = c(1916, 1916, 1917, 1917, 1917, 1918, 1918, 1918, 1919, 1919), Value = c(123, 456, 123, 159, 487, 321, 456, 789, 154, 487), Rank = c(1,2,1,2,3,1,2,3,1,2)) 
l.1 <- list(df1.1, df2.1)

1 个答案:

答案 0 :(得分:2)

一种方法可能是:

library(tidyverse)

 l %>% 
   map(. %>%
   group_by(Year) %>%
   mutate(Rank = rank(Value)))

[[1]]
# A tibble: 8 x 3
# Groups:   Year [3]
   Year Value  Rank
  <dbl> <dbl> <dbl>
1  1860   487     3
2  1860   456     2
3  1860   123     1
4  1861   159     2
5  1861   123     1
6  1862   789     3
7  1862   456     2
8  1862   321     1

[[2]]
# A tibble: 10 x 3
# Groups:   Year [4]
    Year Value  Rank
   <dbl> <dbl> <dbl>
 1  1916   123     1
 2  1916   456     2
 3  1917   487     3
 4  1917   123     1
 5  1917   159     2
 6  1918   321     1
 7  1918   789     3
 8  1918   456     2
 9  1919   487     2
10  1919   154     1