我有一个类似矩阵的数据框,其中有一个额外的列表示时间。它包含给定学校注册学生人数的信息,从 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::leadB 列的值分别移动 1、2 等,然后将结果与原始数据中的 Etime 列绑定(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/

10-13 00:08