【问题标题】:maximum length or constant最大长度或常数
【发布时间】:2019-07-12 13:19:47
【问题描述】:

我有一个向量 v,它是为 data.table 中的每个组即时创建的,例如:

x[,i[v[1:n]], by=.(group)]

v 的长度对于每个组是不同的,所以我不能在 data.table 之外定义length(v)

常数n给出了我感兴趣的v的最高元素。如果n <= length(v)没有问题,我可以查询

v[1:n]

但是,当n>length(v) 时,我调用了一个不存在的索引。因此,我需要一个可以在v[1:f(n)] 中使用的函数f(n),以便它返回

v[1:length(v)] if n>length(v)
v[1:n] if n<=length(v)

我可以将ifelse(.) 写入索引,但这会变得很长。我想知道是否有一个功能可以做到这一点。在 matlab 中,有一个变量 end 用于向量的长度。自己编写一个函数很困难,因为在 data.table 之外执行v 是没有意义的。

【问题讨论】:

    标签: r indexing data.table


    【解决方案1】:

    我们可以使用pmin 来检查 'n' 和 'v' 之间的长度。如果'n'小于'v'的length,它使用'n',当它大于'v'的长度时,它使用'v'

    n1 <- pmin(n, length(v))
    v[seq_len(n1)]
    

    关于data.table 中的 OP' 问题。

    x[, {
          n1 <- pmin(n, length(v))
          i[v[seq_len(n1]]
          },
                  by=.(group)]
    

    【讨论】:

    • 问题是我无法在 data.table 之外评估length(v)。原因是它是某个图的subcomponent(.)。如果我理解正确,创建n1 将需要我这样做。 matlab 的end 的美妙之处在于这不是必需的。
    • @bumblebee 不清楚这个问题。如果是data.table,可以在data.table里面创建'n1'吗?
    • 不,因为它取决于组。已在问题中添加示例。
    • 效果惊人。我不知道data.table 中的{...} 选项。
    • 明白(谢谢!)。我认为可以删除您答案中的“在这里,我们假设 n 为 .N”,对吗?
    猜你喜欢
    • 2014-12-26
    • 2013-10-08
    • 1970-01-01
    • 2015-07-18
    • 2022-01-06
    • 2010-09-15
    • 2014-10-03
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多