【问题标题】:How to identify the objects of a list with >1 rows in R?如何识别R中> 1行的列表对象?
【发布时间】:2017-07-20 22:55:22
【问题描述】:

我想知道如何在R 中用>1 rows 识别list 的对象?

例如,假设我们有以下list

 c = 6:10
 d = 1:5
 f = 11:15

output <- list(var1 = rbind(c,d,f), var2 = c, var3 = rbind(d,f))
output

$var1
  [,1] [,2] [,3] [,4] [,5]
c    6    7    8    9   10
d    1    2    3    4    5
f   11   12   13   14   15

$var2
[1]  6  7  8  9 10

$var3
  [,1] [,2] [,3] [,4] [,5]
d    1    2    3    4    5
f   11   12   13   14   15

期望有一个文件列出或提供object 的名称和&gt; 1 row,如下所示:

output2
 $var1
  [,1] [,2] [,3] [,4] [,5]
c    6    7    8    9   10
d    1    2    3    4    5
f   11   12   13   14   15

$var3
  [,1] [,2] [,3] [,4] [,5]
d    1    2    3    4    5
f   11   12   13   14   15

output2 
[1] var1, var3

提前感谢您在解释方面的帮助!

【问题讨论】:

    标签: r list object data-manipulation


    【解决方案1】:

    您可以在基数 R 中使用 sapplydim、isTRUE 和 [

    output[sapply(output, function(i) isTRUE(dim(i)[1] > 1))]
    $var1
      [,1] [,2] [,3] [,4] [,5]
    c    6    7    8    9   10
    d    1    2    3    4    5
    f   11   12   13   14   15
    
    $var3
      [,1] [,2] [,3] [,4] [,5]
    d    1    2    3    4    5
    f   11   12   13   14   15
    

    sapply 遍历每个对象并检查行维度(dim 的第一个元素)是否大于 1。但是,由于向量和其他一些对象(例如列表)没有维度属性,这检查返回logical(0)。为了强制输出 FALSE,我们将输出包装在 isTRUE 中。由sapply 产生的逻辑向量用于对列表进行子集化。

    【讨论】:

    • @Imo 非常聪明!谢谢你的解释 ! :)
    【解决方案2】:

    这是另一个想法:

    c = t(6:10)
    d = t(1:5)
    f = t(11:15)
    
    output <- list(var1 = rbind(c,d,f), var2 = c, var3 = rbind(d,f))
    output
    
    nrow(as.data.frame(output[1]))>1
    nrow(as.data.frame(output[2]))>1
    nrow(as.data.frame(output[3]))>1
    
    f <- function(x) nrow(as.data.frame(x))>1
    sapply(output, f)
    which(sapply(output, f))
    

    我认为你需要在这里取原始向量的转置函数t(),以确保它们被视为一行多列,而不是多列一行。

    【讨论】:

      【解决方案3】:

      purrr 的优雅解决方案:

      library(purrr)    
      keep(output, ~ (nrow(.) %||% 1) > 1) 
      

      当我们将nrow 应用于一维对象时,NULL 可能会出现(并且确实出现在您的示例中)。所以这个%||% 1 在这里用 1 替换 NULL。

      或者更像@lmo 的做法:

      keep(output, ~ isTRUE(nrow(.) > 1))
      

      【讨论】:

        【解决方案4】:

        可能有很多方法可以做到这一点,但这应该可行:

        output2 <- names(which(unlist(purrr::map(output, ~nrow(.x)>1))==TRUE))

        【讨论】:

        • 可能你需要修改你的答案,因为你的脚本的结果是不想要的;)
        • 哦,这很奇怪,当我运行它时,我的输出"var1" "var3" 它为你输出了什么?
        • 我得到了所有三个“变量”!
        • 如果您像在原始问题中那样定义 cdf,这不应该发生,但如果您将其定义为 Green Stone 在他们的示例中所做的那样,那么那会发生。我已对其进行了更新以使其工作。
        猜你喜欢
        • 2010-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 2016-02-16
        • 2019-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多