在包含两列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)
答案 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