在R中保持向量中字符串出现的滚动计数

在R中保持向量中字符串出现的滚动计数,r,R,我的问题最好通过一个简单的例子来解决: my_strings = c("apple", "banana", "carrot", "apple", "apple", "dairy", "banana", "eggplant", "flowers", "flowers", "apple", "banana") my_repeats = c(0, 0, 0, 1, 2, 0, 1, 0, 0, 1, 3, 2) my_repeats向量可以通过从头到尾遍历my_strings元素得到最好的理解,每

我的问题最好通过一个简单的例子来解决:

my_strings = c("apple", "banana", "carrot", "apple", "apple", "dairy", "banana", "eggplant", "flowers", "flowers", "apple", "banana")

my_repeats = c(0, 0, 0, 1, 2, 0, 1, 0, 0, 1, 3, 2)
my_repeats向量可以通过从头到尾遍历my_strings元素得到最好的理解,每次遍历一个元素。由于首次访问时,苹果、香蕉和胡萝卜尚未出现在字符串中,因此它们都被分配为0。然后苹果出现了第二次和第三次(第一次和第二次重复),所以它得到了1和2。然后是0,因为dairy还没有出现,然后是1,因为banana第一次重复出现,等等

能够计算字符串的重复次数,并将数据存储在相同长度的向量中,这将有助于我完成大量的工作。但我不确定是否有一种快速、矢量化的方法可以做到这一点。任何想法都很感激


编辑:基本上我需要的是一个累积计数函数-我现在正在检查是否存在字符串。

带有
seq\u的
ave
函数可用于此:

as.numeric(ave(my_strings, my_strings, FUN = seq_along)) - 1
##  [1] 0 0 0 1 2 0 1 0 0 1 3 2
“data.table”中还有
rowid
函数:


对于数据帧列中的字符串,这里有一个
dplyr
解决方案:

library(dplyr)
df1 <- data.frame(words = c("apple", "banana", "carrot", "apple", "apple", "dairy", 
                            "banana", "eggplant", "flowers", "flowers", "apple", "banana"), 
                  stringsAsFactors = FALSE)

df1 %>% 
  group_by(words) %>% 
  mutate(count = sequence(n()) - 1)
库(dplyr)
df1%
分组依据(字)%>%
突变(计数=序列(n())-1)

这不是最简单的方法,但是如果你想深入了解它的内部结构,你可以自己编写一个

mat[1]0 0 1 0 1 0 1 3 2

您不需要显式创建
data.frame
,是吗?你就不能让它成为你管道的一部分吗<代码>数据.frame(my_strings)%%>%group_by(my_strings)%%>%mutate(count=sequence(n())-1)
?这太直接和简单了-不如将
改为.numeric(gsub([^0-9],“0”,make.unique(my_strings))
library(dplyr)
df1 <- data.frame(words = c("apple", "banana", "carrot", "apple", "apple", "dairy", 
                            "banana", "eggplant", "flowers", "flowers", "apple", "banana"), 
                  stringsAsFactors = FALSE)

df1 %>% 
  group_by(words) %>% 
  mutate(count = sequence(n()) - 1)