【问题标题】:Return data frame index with minimum number of rows from a subsetted list从子集列表中返回具有最少行数的数据框索引
【发布时间】:2019-07-13 12:51:47
【问题描述】:

我有一个包含 4 个数据框 a1、a2、a3 和 a4 的原始列表。

现在,我在包含列表 a 的 a1 和 a4 的 2 个数据帧的新列表 b 中子集列表 a。 我想在列表 b 中找到相应的列表 a 数据框的索引,该列表在列表 b 中具有最少的行数。

所以,比较列表 b 中数据帧的行数(a1 和 a4),结果应该是 4,因为 a4 是列表 b 中行数最少的数据帧,并且因为 a4 在中的索引为 4列出一个。

a1<-data.frame(v1=c(1,2,3),v2=c(1,2,3),v3=c(1,2,3))
a2<-data.frame(v1=c(),v2=c(),v3=c())
a3<-data.frame(v1=c(1,2,3,4,5,6),v2=c(1,2,3,4,5,6),v3=c(1,2,3,4,5,6))
a4<-data.frame(v1=c(1),v2=c(1),v3=c(1))
a<-list(a1,a2,a3,a4)

b<-a[c(1,4)]

我已经尝试过:

which.min(sapply(b,nrow))

按照我的方式,我在列表 b 中获得了 a4(行数最少的数据框)的索引。 我想获得列表 b 中最小行数数据框的 LIST A INDEX。

注意:最小行操作发生在列表 b 中。

【问题讨论】:

    标签: r list subset min


    【解决方案1】:

    如果a 中的数据框的所有行数不同,一种方法是找到b 中的最小行数,并找到a 中的which 元素具有相同的行数的行。

    which(min(sapply(b, nrow)) == sapply(a, nrow))
    #[1] 4
    

    但是,更好的全证明方法是首先找到b 中行数最少的数据帧,然后找到a 中的哪个数据帧是identical

    min_df <- b[[which.min(sapply(b, nrow))]]
    which(sapply(a, function(x) identical(min_df, x)))
    #[1] 4
    

    编辑

    另一种方法可能是

    min_index <- which.min(sapply(b, nrow))
    which(sapply(a, identical, b[[min_index]]) & seq_along(a) > min_index)
    

    【讨论】:

    • 我试图找到行数最少的数据框,并找出 a 中的哪个数据框与 a 中的相同。但是,如果列表 a 具有与我之前找到的更相同的数据框,您建议怎么做?例如,假设列表 a 有 4 个空数据框 a1、a2、a3 和 a4。我对它进行子集化,然后得到带有数据框 a1 和 a4 的列表 b。现在,假设行数最少的数据框是a4(在这种情况下也可能是a1),我如何检索列表a中的a4索引?
    • @David 如果您尝试根据行数进行操作,那么 a1a4 没有区别,因为它们都有 0 行。使用which 将为您提供a 中与b 中的索引匹配的所有索引。如果您只想要一个,您可以使用which.max,它将返回第一个匹配项。
    • 是的,但是如果想要在 a 中获得第 4 个匹配项,即使其他数据帧相同,该怎么办?因为在我的代码列表中,b 是基于特定条件从列表 a 中子集的。最低行数本质上是“过滤”原始列表 a 的另一个条件,但应用于 b 这是另一个过滤条件的结果。最后,我得到一个数据框,它是所有条件的结果,我在其中 rbind 一行。这个最终的数据框将替换列表 a 中的旧数据框。
    • @David 我不太清楚选择第 4 次而不是第 1 次的原因。但是,我更新了一种方法,您可以在其中检查索引以及数据框匹配。
    • 我已经尝试过,感谢您的帮助。但是,您的新方法不起作用,给我返回列表 a 的错误索引(索引)。你想用 seq_along(a) > min_index 做什么?
    猜你喜欢
    • 2016-07-19
    • 2012-11-18
    • 1970-01-01
    • 2020-12-29
    • 2022-12-30
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多