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)
我真的想看看是否有任何统计或特定于域的语言都有这样的函数/指令以及它可能被称为什么.
在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(...)).
在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)
| 归档时间: |
|
| 查看次数: |
419 次 |
| 最近记录: |