我有一个类似矩阵的数据框,其中有一个额外的列表示时间。它包含给定学校注册学生人数的信息,从 5 年级(列 A
)到 9 年级(列 E
)。
time A B C D E
1 13 1842 1844 1689 1776 1716
2 14 1898 1785 1807 1617 1679
3 15 2065 1865 1748 1731 1590
4 16 2215 1994 1811 1708 1703
5 17 2174 2122 1903 1765 1699
我需要随着时间的推移追踪队列的规模,这意味着我需要逐行信息,了解从 6 年级到 9 年级的每个开学年有多少五年级学生留在学校。例如,对于已经开始五年级的队列在 2013 年,我想知道 2014 年有多少人还在读六年级,等等。
预期输出
这就是我想要的结果:
start.time point.A point.B point.C point.D point.E
1 13 1842 1785 1748 1708 1699
2 14 1898 1865 1811 1765 NA
3 15 2065 1811 1765 NA NA
4 16 2215 1765 NA NA NA
5 17 2174 NA NA NA NA
我查看了
diag()
中的 base.R
,但我只能从主对角线获取数据。理想情况下,我想使用 dplyr
语法和管道来完成此操作。数据
structure(list(time = 13:17, A = c(1842, 1898, 2065, 2215, 2174), B = c(1844, 1785, 1865, 1994, 2122), C = c(1689, 1807, 1748, 1811, 1903), D = c(1776, 1617, 1731, 1708, 1765), E = c(1716, 1679, 1590, 1703, 1699)), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L), vars = "time", drop = TRUE, indices = list(
0L, 1L, 2L, 3L, 4L), group_sizes = c(1L, 1L, 1L, 1L, 1L), biggest_group_size = 1L, labels = structure(list(
time = 13:17), class = "data.frame", row.names = c(NA, -5L), vars = "time", drop = TRUE, .Names = "time"), .Names = c("time", "A", "B", "C", "D", "E"))
最佳答案
由于您在问题中提到了 dplyr
,因此您可以使用 dplyr::lead
将 B
列的值分别移动 1、2 等,然后将结果与原始数据中的 E
和 time
列绑定(bind),如下所示
library(tidyverse)
bind_cols(df[, 1:2], map2_df(.x = df[, c(3:ncol(df))],
.y = seq_along(df[, 3:ncol(df)]),
.f = ~dplyr::lead(x = .x, n = .y)))
# A tibble: 5 x 6
# Groups: time [5]
# time A B C D E
# <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 13 1842 1785 1748 1708 1699
#2 14 1898 1865 1811 1765 NA
#3 15 2065 1994 1903 NA NA
#4 16 2215 2122 NA NA NA
#5 17 2174 NA NA NA NA
请注意,您的数据按照您提供的方式按
A
分组。关于r - data.frame 中行的对角线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48704928/