用于计算已经看到值的次数的函数/指令

hay*_*sti 7 dsl matlab programming-languages r instructions

我试图确定MATLAB或R是否具有类似于以下的功能.

说我有一个输入向量v.

v = [1, 3, 1, 2, 4, 2, 1, 3]
Run Code Online (Sandbox Code Playgroud)

我想生成一个w 等长的矢量v.每个元素w[i]应该告诉我以下内容:对于相应的值v[i],到目前为止遇到此值的次数v,即在v最多但不包括位置的所有元素中i.在这个例子中

w = [0, 0, 1, 0, 0, 1, 2, 1]
Run Code Online (Sandbox Code Playgroud)

我真的想看看是否有任何统计或特定于域的语言都有这样的函数/指令以及它可能被称为什么.

Lui*_*ndo 7

在Matlab中没有一个函数(据我所知),但你可以这样实现它:

w = sum(triu(bsxfun(@eq, v, v.'), 1));
Run Code Online (Sandbox Code Playgroud)

说明:bsxfun(...)将每个元素相互比较.然后triu(..., 1)仅保留元素与先前元素的匹配(即,对角线上方的值).最后,sum(...)将所有巧合与之前的元素相加.


更明确但更慢的替代方案(不推荐)是:

w = arrayfun(@(n) sum(v(1:n-1)==v(n)), 1:numel(v));
Run Code Online (Sandbox Code Playgroud)

说明:对于每个索引n(其中n变化为1:numel(v)),将所有先前元素v(1:n-1)与当前元素进行比较v(n),并获取匹配数(sum(...)).


akr*_*run 7

R,你可以试试这个:

 v <- c(1,3,1,2,4,2,1,3)
 ave(v, v, FUN=seq_along)-1
 #[1] 0 0 1 0 0 1 2 1
Run Code Online (Sandbox Code Playgroud)

说明

 ave(seq_along(v), v, FUN=seq_along)  #It may be better to use `seq_along(v)` considering different classes i.e. `factor` also.
 #[1] 1 1 2 1 1 2 3 2
Run Code Online (Sandbox Code Playgroud)

在这里,我们将元素序列分组v.对于匹配相同组的元素,该seq_along函数将创建1,2,3 etc.在这种情况下v,同一组的元素1处于位置1,3,7,因此那些相应的位置将是1,2,3.通过减去1,我们将能够从中开始0.

要更好地理解它,

 lst1 <- split(v,v)
 lst2 <- lapply(lst1, seq_along)
 unsplit(lst2, v)
 #[1] 1 1 2 1 1 2 3 2
Run Code Online (Sandbox Code Playgroud)

运用 data.table

  library(data.table)
  DT <- data.table(v, ind=seq_along(v))
  DT[, n:=(1:.N)-1, by=v][,n[ind]]
  #[1] 0 0 1 0 0 1 2 1
Run Code Online (Sandbox Code Playgroud)