R - 将向上对角线转换为行

2024-01-16

我得到一个矩阵、数据框或数据表。我想创建一个矩阵,其中向上/反向对角线作为行,其余单元格作为 NA。我能够做到这一点。但我认为,应该有一个更容易、更简单的解决方案。因此,任何解决方案都值得赞赏。

作为一个例子,假设我得到以下 data.table

 df1<-as.data.table(matrix(seq(1:100),nrow=20, byrow = TRUE))

 > structure(df1)
     V1 V2 V3 V4  V5
  1:  1  2  3  4   5
  2:  6  7  8  9  10
  3: 11 12 13 14  15
  4: 16 17 18 19  20
  5: 21 22 23 24  25
  6: 26 27 28 29  30
  7: 31 32 33 34  35
  8: 36 37 38 39  40
  9: 41 42 43 44  45
 10: 46 47 48 49  50
 11: 51 52 53 54  55
 12: 56 57 58 59  60
 13: 61 62 63 64  65
 14: 66 67 68 69  70
 15: 71 72 73 74  75
 16: 76 77 78 79  80
 17: 81 82 83 84  85
 18: 86 87 88 89  90
 19: 91 92 93 94  95
 20: 96 97 98 99 100

> dput(df1)
structure(list(V1 = c(1L, 6L, 11L, 16L, 21L, 26L, 31L, 36L, 41L, 
46L, 51L, 56L, 61L, 66L, 71L, 76L, 81L, 86L, 91L, 96L), V2 = c(2L, 
7L, 12L, 17L, 22L, 27L, 32L, 37L, 42L, 47L, 52L, 57L, 62L, 67L, 
72L, 77L, 82L, 87L, 92L, 97L), V3 = c(3L, 8L, 13L, 18L, 23L, 
28L, 33L, 38L, 43L, 48L, 53L, 58L, 63L, 68L, 73L, 78L, 83L, 88L, 
93L, 98L), V4 = c(4L, 9L, 14L, 19L, 24L, 29L, 34L, 39L, 44L, 
49L, 54L, 59L, 64L, 69L, 74L, 79L, 84L, 89L, 94L, 99L), V5 = c(5L, 
10L, 15L, 20L, 25L, 30L, 35L, 40L, 45L, 50L, 55L, 60L, 65L, 70L, 
75L, 80L, 85L, 90L, 95L, 100L)), row.names = c(NA, -20L), class = c("data.table","data.frame"), .internal.selfref = <pointer: 0x1038072e0>)

然后下面的代码完成这项工作:

 df1 <- df1[nrow(df1):1,]
 df1 <- as.data.table(df1)
 n <- ncol(df1)
 df1 <- mapply(function(x, y) shift(x, n=y, type = "lead"), df1, seq_len(n)-1)
 df1 <- df1[nrow(df1):1,]

然后我得到想要的结果:

> structure(df1)
   V1 V2 V3 V4 V5
 [1,]  1 NA NA NA NA
 [2,]  6  2 NA NA NA
 [3,] 11  7  3 NA NA
 [4,] 16 12  8  4 NA
 [5,] 21 17 13  9  5
 [6,] 26 22 18 14 10
 [7,] 31 27 23 19 15
 [8,] 36 32 28 24 20
 [9,] 41 37 33 29 25
[10,] 46 42 38 34 30
[11,] 51 47 43 39 35
[12,] 56 52 48 44 40
[13,] 61 57 53 49 45
[14,] 66 62 58 54 50
[15,] 71 67 63 59 55
[16,] 76 72 68 64 60
[17,] 81 77 73 69 65
[18,] 86 82 78 74 70
[19,] 91 87 83 79 75
[20,] 96 92 88 84 80

structure(c(1L, 6L, 11L, 16L, 21L, 26L, 31L, 36L, 41L, 46L, 51L, 
56L, 61L, 66L, 71L, 76L, 81L, 86L, 91L, 96L, NA, 2L, 7L, 12L, 
17L, 22L, 27L, 32L, 37L, 42L, 47L, 52L, 57L, 62L, 67L, 72L, 77L, 
82L, 87L, 92L, NA, NA, 3L, 8L, 13L, 18L, 23L, 28L, 33L, 38L, 
43L, 48L, 53L, 58L, 63L, 68L, 73L, 78L, 83L, 88L, NA, NA, NA, 
4L, 9L, 14L, 19L, 24L, 29L, 34L, 39L, 44L, 49L, 54L, 59L, 64L, 
69L, 74L, 79L, 84L, NA, NA, NA, NA, 5L, 10L, 15L, 20L, 25L, 30L, 
35L, 40L, 45L, 50L, 55L, 60L, 65L, 70L, 75L, 80L), .Dim = c(20L, 
5L), .Dimnames = list(NULL, c("V1", "V2", "V3", "V4", "V5")))

一个选择是通过n的参数shift从 0 到 4 对应于 Data.table 子集中的每一列 (.SD)

df1[, Map(shift, .SD, n = 0:4)]
#     V1 V2 V3 V4 V5
# 1:  1 NA NA NA NA
# 2:  6  2 NA NA NA
# 3: 11  7  3 NA NA
# 4: 16 12  8  4 NA
# 5: 21 17 13  9  5
# 6: 26 22 18 14 10
# 7: 31 27 23 19 15
# 8: 36 32 28 24 20
# 9: 41 37 33 29 25
#10: 46 42 38 34 30
#11: 51 47 43 39 35
#12: 56 52 48 44 40
#13: 61 57 53 49 45
#14: 66 62 58 54 50
#15: 71 67 63 59 55
#16: 76 72 68 64 60
#17: 81 77 73 69 65
#18: 86 82 78 74 70
#19: 91 87 83 79 75
#20: 96 92 88 84 80

The type将是“滞后”而不是“领先”,默认情况下它是“滞后”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R - 将向上对角线转换为行 的相关文章

  • R:如何添加具有从矩阵的每一行中随机选择的值的列?

    我会先说我是一个 R 菜鸟 我认为这可能有一个简单的解决方案 但我正在努力寻找它 我有一个 2 列 1 000 行的矩阵 保持行固定 我想创建一个新变量 从两列中随机选择一个元素 例如制作一个简单的矩阵 matrix c 1 1 4 6 1
  • dplyr :过滤一系列行(在一列中)

    虚拟数据框 id family lt c 1 1 2 2 3 3 people lt c male female male female male children dataset lt data frame id family peopl
  • 当按多列分组时,如何命名 dplyr 中的 group_split 列表

    我在 dplyr 中使用 group split 在分割了多个列后 我很难命名列表 当我们按一列分组时 我知道该怎么做here https stackoverflow com questions 57107721 how to name t
  • ggmap 错误:GeomRasterAnn 是使用不兼容版本的 ggproto 构建的

    我正在使用 ggmap 并收到以下错误 Error GeomRasterAnn was built with an incompatible version of ggproto Please reinstall the package t
  • xml2 包 (R) 中的 xml_find_all 函数未找到相关节点

    我使用 R 中的 xml2 包来访问 xml 数据 发现它在不同的 xml documents 上表现不同 在这个宠物的例子中 library xml2 doc lt read xml
  • 为什么 rbind 会抛出警告

    这与是否有更优雅的方法将不规则的数据转换为整洁的数据框 https stackoverflow com questions 25102617 are there more elegant ways to transform ragged d
  • R Shiny - 修复了 Shiny 仪表板中的侧边栏和主标题

    我有一个简化的闪亮仪表板 请参阅下面的代码 我想修复侧边栏和主标题 因此 在其他帖子的帮助下 我编写了一个 CSS 文件来解决该问题 sidebar color FFF position fixed width 220px white sp
  • 将函数应用于每个列组合

    我有一个数据框n列并希望对每个列应用一个函数组合列 这与如何cor 函数将数据帧作为输入并生成相关矩阵作为输出 例如 X lt data frame A rnorm 100 B rnorm 100 C rnorm 100 cor X 这将生
  • 如何更改 Quarto pptx 中的字体格式

    我正在 R 中使用 Quarto 创建 pptx 要更改我尝试更改的默认字体格式mainfont范围 但是当我渲染它时 最终的 pptx 文件具有默认字体 Calibri 这是我的文件 YAML 将 Quarto 文件渲染为 pptx 时如
  • 使 matplotlib 图形默认看起来像 R?

    Is there a way to make matplotlib behave identically to R or almost like R in terms of plotting defaults For example R t
  • 根据列A:列B范围内的值查找数据框中的相应行[重复]

    这个问题在这里已经有答案了 我有一个 data frame 和一个向量 例如 df data frame id 1 3 start c 1 1000 16000 end c 100 1100 16100 info c a b c vec c
  • 如何转置 R markdown 文档中的表格?

    假设我打印一个名为summary table的数据框 如下所示 summary table data frame a c 1 2 3 b c 11 12 13 c c 21 22 23 d c 31 32 33 e c 41 42 43 f
  • 如何获得 R 帮助?

    R 包可能有哪些可用文档 例如我尝试理解sp包裹 此外help sp 还有哪些用于搜索帮助和文档的其他功能 获取有关您知道其名称的函数的帮助 Use http www inside r org r doc utils Question或者
  • 使用 plyr daply 将数据帧转换为矩阵

    我正在尝试使用daply函数在plyr包 但我无法让它正确输出 尽管组成矩阵的变量是数字 但矩阵的元素是列表 而不是变量本身 例如 以下是一小部分数据 Month Vehicle Samples 1 Oct 10 31057 256 2 O
  • R中的等值线绘图问题

    编辑 我已经意识到问题的根源 我只有我有数据的县的计数信息 该信息少于我正在绘制的区域中的县数量 按理说 问题代码行在这里 mapnames lt map county plot FALSE 4 names colorsmatched lt
  • 如何将环境变量传递给shinyapps

    我想将安全参数传递给shinyapps io部署 以便我的应用程序可以通过以下方式获取它们 Sys getenv PASSWORD X 我找不到任何相关内容deployApp函数在rsconnect包裹 您可以使用Renviron网站 or
  • 使用 LINQ 更新 DataTable 中的两列

    我想使用 LINQ 查询在一行中更新 DataTable 的两列 目前我正在使用以下两行来执行相同的操作 oldSP Select string Format itemGuid 0 itemGuid ToList
  • svyby比例的置信区间

    是否存在创建置信区间的现有函数 从一个svyby比例对象 在我的例子中 是一个二进制项目的交叉表survey包裹 我经常比较各组之间的比例 如果有一个可以提取置信区间的函数 使用调查函数svyciprop而不是confint 下面的示例显示
  • R 中的 huxtable 即使有选项也默认为科学记数法(scipen=999)

    我试图生成像样的桌子 并在过去的一周尝试了很多软件包 我的头在游泳 今天早上开始使用 package huxtable 并试图摆脱科学记数法 x lt mtcars 1 5 1 2 x mpg lt x mpg 10000000 get s
  • 如何在r中进行左连接[重复]

    这个问题在这里已经有答案了 我有两个数据集一和二 数据集一 a b c 111 a 1 112 b 2 113 c 3 114 d 4 115 e 5 数据集二 e d g 222 ss 11 111 ff 22 113 ww 33 114

随机推荐