gpt4 book ai didi

r - data.frame 中行的对角线

转载 作者:行者123 更新时间:2023-12-04 23:13:52 25 4
gpt4 key购买 nike

我有一个类似矩阵的数据框,其中有一个额外的列表示时间。它包含给定学校注册学生人数的信息,从 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"))

最佳答案

转换输入 DF除了矩阵的第一列 mat .然后自 row(mat) - col(mat)在对角线上是常数 split关于创建 ts 的列表类(class)系列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])))

给予:
  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

关于r - data.frame 中行的对角线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48704928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com