tif*_*ifu 4 r data-manipulation dplyr
我有一个类似矩阵的数据框,附加一列表示时间.它包含有关特定学校注册学生人数的信息,从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
Run Code Online (Sandbox Code Playgroud)
我需要跟踪的队列随时间的大小,这意味着我需要多少个五年级学生按行信息,从各个年度开始到9例如保持在从6年级的学校,对于已经开始五年级队列在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
Run Code Online (Sandbox Code Playgroud)
我已经看过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"))
Run Code Online (Sandbox Code Playgroud)
将DF第一列以外的输入转换为矩阵mat.然后,因为row(mat) - col(mat)在对角线split上是恒定的,相对于创建一个ts类系列列表L.我们使用了ts类,因为我们可以在以后使用cbind它们,即使它们的长度不同.对角线row(mat) - col(mat) >= 0是我们唯一想要的对象,所以选择它们,cbind它们在一起并转换结果.然后替换DF除第一列以外的所有列.没有使用包裹.
mat <- as.matrix(DF[-1])
L <- lapply(split(mat, row(mat) - col(mat)), ts)
replace(DF, -1, t(do.call("cbind", L[as.numeric(names(L)) >= 0])))
Run Code Online (Sandbox Code Playgroud)
赠送:
time A B C D E
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |