【问题标题】:extract specific rows from nested lists of class dist in r从 r 中类 dist 的嵌套列表中提取特定行
【发布时间】:2019-05-09 23:33:54
【问题描述】:

我确定这个问题是重复的,但我找不到正确的解决方案。我有一个很大的嵌套列表,它实际上是来自 lapply dist() 的类“dist”输出的列表。我现在想从每个列表中提取最后一行(因为我只关心原始列表的最后一行与同一个嵌套列表中的所有其他行之间的距离。我可以将其转换为矩阵,但这并没有真的帮了我。

Extract then row.bind data.frames from nested listsR - Extracting information from list of lists of data.frames 以及其他一些相关帖子中我更接近了。

我可以使用这个从每个嵌套列表中提取第一个元素(对应于第一列),但我想要行: sapply(df,'[[',1)

这确实做了一些事情,但不确定到底是什么: lapply(df, function(x) lapply(x, '[' , drop = FALSE))

我对 dist() 的原始输入如下。我有一个包含 x、y、z 坐标的 1000 个列表的嵌套列表(有很多行,这是一个示例): [[1]] x y z -5.924184e-02 -0.0101882607 0.0017658100 -8.884432e-02 0.0454085919 -0.1072237461 1.495407e-02 0.0592509097 -0.0107400982
[[2]] 5.211102e-02 -0.0141554617 -0.0176815372 -2.861500e-02 -0.1155798724 0.0561973096 2.230498e-03 -0.0264566373 -0.0501298532
然后我用这个函数创建了 1000 个距离矩阵:

lapply(orig.df[1:1000],dist) -> df

这是 str(df) 的顶部输出

str(df)
List of 1000
 $ :Class 'dist'  atomic [1:2628] 0.126 0.102 0.136 0.104 0.139 ...
  .. ..- attr(*, "Size")= int 73
  .. ..- attr(*, "Labels")= chr [1:73] "2" "8" "10" "14" ...
  .. ..- attr(*, "Diag")= logi FALSE
  .. ..- attr(*, "Upper")= logi FALSE
  .. ..- attr(*, "method")= chr "euclidean"
  .. ..- attr(*, "call")= language FUN(x = X[[i]])

基本上我现在想做的是:

df[1:1000][nrow(df),]

对于所有 1000 个嵌套列表(距离矩阵),取最后一个“行”和所有“列”。这是类 dist 的距离矩阵。看起来很简单,但让我很难过。感谢您的帮助。

【问题讨论】:

  • 您是否要求输入 dist() 的示例?我正在尝试为所有 1000 个距离矩阵提取距离矩阵的最后“行”,这些距离矩阵都在一个列表(df)中。我看看能不能修改一下。
  • “我现在想从每个列表中提取最后一行” 你的意思是每个distance 矩阵的最后一行吗?
  • 是的,完全正确!我有 1000 个嵌套距离矩阵。如果我不将我的 df 转换为矩阵,它们是类“list”和 typeof “list”,所以我认为我使用了正确的术语。谢谢。
  • 我没有否决你的问题;但我想,否决票是由于您的帖子不包括任何可重现的最小样本数据,这始终是good questions 询问如何做 XYZ 的关键组成部分。我已经在下面发布了一个答案(基于一些最小的样本数据),请看一下。
  • 附言。一般来说,我同意你的看法,因为如果没有任何额外的 cmets,投票可能难以解释。然而,被否决的原因往往非常一致:缺乏样本数据、数据/代码作为屏幕截图、没有代码尝试、多个问题或没有特定问题。所以我想说,通过该列表来查看您的问题在哪里不足通常是一个很好的起点。如果您勾选了所有方框并且仍然收到反对票,那就是事情变得棘手的时候。无论哪种方式,都不要将 DV 带入私人领域并坚持下去。

标签: r list nested apply


【解决方案1】:

这是一个基于mtcars使用最小样本数据的示例

lst <- lapply(1:3, function(x) dist(mtcars[, 1:3]))

我们现在从lst 中提取每个distance 矩阵的最后一行

lapply(lst, function(x) { mat <- as.matrix(x); mat[nrow(mat), ] })
#[[1]]
#          Mazda RX4       Mazda RX4 Wag          Datsun 710      Hornet 4 Drive
#         39.0532969          39.0532969          13.0751673         137.0145978
#  Hornet Sportabout             Valiant          Duster 360           Merc 240D
#        239.0487189         104.0715619         239.1388927          25.8745048
#           Merc 230            Merc 280           Merc 280C          Merc 450SE
#         19.8494332          46.6947535          46.7816203         154.9323723
#         Merc 450SL         Merc 450SLC  Cadillac Fleetwood Lincoln Continental
#        154.9059392         154.9757400         351.1951025         339.2020047
#  Chrysler Imperial            Fiat 128         Honda Civic      Toyota Corolla
#        319.0954246          43.7068644          46.1853873          51.4418118
#      Toyota Corona    Dodge Challenger         AMC Javelin          Camaro Z28
#          0.9055385         197.1289172         183.1486828         229.1781185
#   Pontiac Firebird           Fiat X1-9       Porsche 914-2        Lotus Europa
#        279.0373452          42.4123803           4.6529560          27.4191539
#     Ford Pantera L        Ferrari Dino       Maserati Bora          Volvo 142E
#        230.1029335          24.1431150         180.1581527           0.0000000
#
#[[2]]
#          Mazda RX4       Mazda RX4 Wag          Datsun 710      Hornet 4 Drive
#         39.0532969          39.0532969          13.0751673         137.0145978
#  Hornet Sportabout             Valiant          Duster 360           Merc 240D
#        239.0487189         104.0715619         239.1388927          25.8745048
#           Merc 230            Merc 280           Merc 280C          Merc 450SE
#         19.8494332          46.6947535          46.7816203         154.9323723
#         Merc 450SL         Merc 450SLC  Cadillac Fleetwood Lincoln Continental
#        154.9059392         154.9757400         351.1951025         339.2020047
#  Chrysler Imperial            Fiat 128         Honda Civic      Toyota Corolla
#        319.0954246          43.7068644          46.1853873          51.4418118
#      Toyota Corona    Dodge Challenger         AMC Javelin          Camaro Z28
#          0.9055385         197.1289172         183.1486828         229.1781185
#   Pontiac Firebird           Fiat X1-9       Porsche 914-2        Lotus Europa
#        279.0373452          42.4123803           4.6529560          27.4191539
#     Ford Pantera L        Ferrari Dino       Maserati Bora          Volvo 142E
#        230.1029335          24.1431150         180.1581527           0.0000000
#
#[[3]]
#          Mazda RX4       Mazda RX4 Wag          Datsun 710      Hornet 4 Drive
#         39.0532969          39.0532969          13.0751673         137.0145978
#  Hornet Sportabout             Valiant          Duster 360           Merc 240D
#        239.0487189         104.0715619         239.1388927          25.8745048
#           Merc 230            Merc 280           Merc 280C          Merc 450SE
#         19.8494332          46.6947535          46.7816203         154.9323723
#         Merc 450SL         Merc 450SLC  Cadillac Fleetwood Lincoln Continental
#        154.9059392         154.9757400         351.1951025         339.2020047
#  Chrysler Imperial            Fiat 128         Honda Civic      Toyota Corolla
#        319.0954246          43.7068644          46.1853873          51.4418118
#      Toyota Corona    Dodge Challenger         AMC Javelin          Camaro Z28
#          0.9055385         197.1289172         183.1486828         229.1781185
#   Pontiac Firebird           Fiat X1-9       Porsche 914-2        Lotus Europa
#        279.0373452          42.4123803           4.6529560          27.4191539
#     Ford Pantera L        Ferrari Dino       Maserati Bora          Volvo 142E
#        230.1029335          24.1431150         180.1581527           0.0000000

【讨论】:

  • 谢谢。这比我做的要容易。
猜你喜欢
  • 1970-01-01
  • 2021-12-29
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2019-08-12
相关资源
最近更新 更多