我有一个df
,包括一组数据帧,df1
,df2
和df3
,其中每个数据帧遵循以下结构:
df1 <- data.frame(year = c("2013", "2013", "2013", "2013", "2013","2013"),
site = c("a", "a", "a", "a", "a", "a"),
trt = c("x", "y", "x", "y", "x", "y"),
cover = c(2, 5, 1,20,50,12))
df2 <- data.frame(year = c("2014", "2014", "2014", "2014", "2014","2014"),
site = c("a", "a", "a", "a", "a", "a"),
trt = c("x", "y", "x", "y", "x", "y"),
cover = c(1, 3, 1,24,32,12))
df3 <- data.frame(year = c("2015", "2015", "2015", "2015", "2015","2015"),
site = c("a", "a", "a", "a", "a", "a"),
trt = c("x", "y", "z", "z", "x", "y"),
cover = c(2, 5, 1,2,11,32))
df <- rbind(df1, df2, df3)
df
year site trt cover
1 2013 a x 2
2 2013 a y 5
3 2013 a x 1
4 2013 a y 20
5 2013 a x 50
6 2013 a y 12
7 2014 a x 1
8 2014 a y 3
9 2014 a x 1
10 2014 a y 24
11 2014 a x 32
12 2014 a y 12
13 2015 a x 2
14 2015 a y 5
15 2015 a z 1
16 2015 a z 2
17 2015 a x 11
18 2015 a y 32
我过去使用for loop
对每年cover
列中的值进行排序。
v1 <- unique(df$year)
lst <- list()
for (i in seq_along(v1)) {
lst[[i]] <- df |>
filter(year == v1[i]) |>
mutate(rank = dense_rank(desc(cover)))
}
现在,我正试图对每年每个组(如trt
列中定义的)的值进行排名,但我不知道如何做到这一点。我怎么能做到这一点与for loop
。我愿意得到lapply
函数的答案,因为我想了解它。
使用dplyr
,我们可以通过在mutate
之前使用group
来避免循环和过滤,然后使用group_split
来构建列表。
library(dplyr)
df |>
group_by(year) |>
mutate(rank = dense_rank(desc(cover))) |>
group_split()
输出:
[[1]]
# A tibble: 6 × 5
year site trt cover rank
<chr> <chr> <chr> <dbl> <int>
1 2013 a x 2 5
2 2013 a y 5 4
3 2013 a x 1 6
4 2013 a y 20 2
5 2013 a x 50 1
6 2013 a y 12 3
[[2]]
# A tibble: 6 × 5
year site trt cover rank
<chr> <chr> <chr> <dbl> <int>
1 2014 a x 1 5
2 2014 a y 3 4
3 2014 a x 1 5
4 2014 a y 24 2
5 2014 a x 32 1
6 2014 a y 12 3
[[3]]
# A tibble: 6 × 5
year site trt cover rank
<chr> <chr> <chr> <dbl> <int>
1 2015 a x 2 4
2 2015 a y 5 3
3 2015 a z 1 5
4 2015 a z 2 4
5 2015 a x 11 2
6 2015 a y 32 1