【问题标题】:Generating a vector of the number of items in each list item生成每个列表项中项数的向量
【发布时间】:2011-01-05 23:48:26
【问题描述】:

我有一个包含 98 个项目的列表。但每个项目包含 0、1、2、3、4 或 5 个字符串。

我知道如何获取列表的长度,实际上是someone has asked the question before,但我可能会因为提出这么简单的问题而被否决。

但我想要一个长度为 98 个元素的向量,每个元素都是从 0 到 5 的整数,告诉我每个列表项中有多少个字符串。 我期待以下工作,但它没有。

lapply(name.of.list,length())

从我的问题中,您会发现我并不真正了解列表和项目的命名法。请随意纠正我。

【问题讨论】:

    标签: list r


    【解决方案1】:

    Farrel,我不完全遵循,因为“item”不是 R 类型。也许您有一个长度为 98 的list,其中每个元素都是字符串向量?

    在这种情况下,考虑一下:

    R> fl <- list(A=c("un", "deux"), B=c("one"), C=c("eins", "zwei", "drei"))
    R> lapply(fl, function(x) length(x))
    $A
    [1] 2
    
    $B
    [1] 1
    
    $C
    [1] 3
    R> do.call(rbind, lapply(fl, function(x) length(x)))
      [,1]
    A    2
    B    1
    C    3
    R> 
    

    所以你有你的列表长度的向量,告诉你每个列表元素有多少个字符串。请注意最后一个do.call(rbind, someList),因为我们从lapply 得到了一个列表。

    另一方面,如果您想计算每个列表位置的所有字符串的长度,请将简单的 length(x) 替换为计算字符的新函数:

    R> lapply(fl, function(x) { sapply(x, function(y) nchar(y)) } )
    $A
      un deux 
       2    4 
    
    $B
    one 
      3 
    
    $C
    eins zwei drei 
       4    4    4 
    
    R> 
    

    如果这不是你想要的,也许你可以模拟一些示例输入数据?

    编辑::响应您的 cmets,您想要的可能是:

    R> do.call(rbind, lapply(fl, length))
      [,1]
    A    2
    B    1
    C    3
    R> 
    

    请注意,我传入的是函数名称length,而不是函数(显示的)主体length()。因为这很容易混淆,所以我几乎总是像我的第一个答案一样应用一个匿名函数。

    是的,这也可以通过 sapply 甚至一些 **ply 函数来完成:

    R> sapply(fl, length)
    A B C 
    2 1 3 
    R> lapply(fl, length)
    [1] 2 1 3
    R> 
    

    【讨论】:

    • 你做的第一种方式就是我想要的。让我去试试。
    • 是的,它奏效了。极好的。事实上 sapply 工作得更好,因为它制作了一个简单的单个向量,我现在可以去 cbind 到一个预先存在的数据帧上。现在你能向我解释一下 lapply(name.of.list,length()) 和 lapply(name.of.list,function(x) length(x)) 有什么不同吗?
    • 请在我的回答中查看额外的编辑——本质上length 与length() 不同,您想要前者。
    【解决方案2】:

    所有这一切似乎都非常复杂 - 有一个函数专门执行您的要求:

    lengths  #note the plural "s"
    

    使用 Dirks 样本数据:

    fl <- list(A=c("un", "deux"), B=c("one"), C=c("eins", "zwei", "drei"))
    lengths(fl)
    

    将返回一个命名的整数向量:

    A B C 
    2 1 3 
    

    【讨论】:

    • 如果列表项是 tibble,如何获得 tibble 的长度?
    【解决方案3】:

    下面的代码接受一个列表并返回一个长度向量:

    x = c("vectors", "matrices", "arrays", "factors", "dataframes", "formulas", 
          "shingles", "datesandtimes", "connections", "lists")
    xl = list(x)
    fnx = function(xl){length(unlist(strsplit(x, "")))}
    lv = sapply(x, fnx)
    

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 2017-07-01
      相关资源
      最近更新 更多