R 具有多个条件的单词出现次数之和

R 具有多个条件的单词出现次数之和,r,R,我希望得到每个公司在过去五年中生产的水果的总数,并用所有的总数构建一个新的列 例如:2016年,b公司生产苹果;橘子;梨而在过去的5年里,b公司生产(2011年:苹果;橙子;香蕉)和(2014年:橙子;梨)。通过计算与重点(2016)年相对应的前五年的水果产量,我们得到4 在我寻找答案的过程中,我只看到了这篇文章中出现的数字的总和。然而,我需要计算一下在过去五年中任何特定公司的所有词汇的出现情况 非常感谢您的帮助,也欢迎使用dplyr的任何解决方案!:) df 公司水果年 1公司有桃子、苹果;橙

我希望得到每个公司在过去五年中生产的水果的总数,并用所有的总数构建一个新的列

例如:2016年,b公司生产苹果;橘子;梨而在过去的5年里,b公司生产(2011年:苹果;橙子;香蕉)和(2014年:橙子;梨)。通过计算与重点(2016)年相对应的前五年的水果产量,我们得到4

在我寻找答案的过程中,我只看到了这篇文章中出现的数字的总和。然而,我需要计算一下在过去五年中任何特定公司的所有词汇的出现情况

非常感谢您的帮助,也欢迎使用dplyr的任何解决方案!:)

df
公司水果年
1公司有桃子、苹果;橙子2010
2个苹果公司;橘子;香蕉2011
3家公司的橙子;梨2014
4公司a香蕉;苹果;橘子;梨2014
5个苹果公司;橘子;梨2016
6家香蕉公司;苹果;橘子;梨;桃子2018
生成的列应如下所示:

df <-  cbind(df, c("0","0","1","2","4","4") 

company                                    fruit year      sum_occurrences
1 company_a                 peaches, apples; oranges 2010               0
2 company_b                 apples; oranges; bananas 2011               0
3 company_b                           oranges; pears 2014               1
4 company_a          bananas; apples; oranges; pears 2014               2
5 company_b                   apples; oranges; pears 2016               4
6 company_a bananas; apples; oranges; pears; peaches 2018               4       

df我不清楚期望的输出是如何执行的。你能更详细地描述一下吗?同意,需要更多的解释。也许更容易看出产出是按公司然后按年份排序的,但我认为OP想要的是按公司在5年的时间窗口内滚动求和
水果中重复的术语。公司A 2010=0,因为第一年。公司A 2014=2,因为苹果和橙子从2010年开始复制(5年内)。公司A 2018=4,因为香蕉、苹果、桔子、梨在2014年复制(5年内)——桃子从2010年起不被视为复制品,因为它是5年前的。OP,这是否正确?您是否考虑过使用tidyr中的单独_行,然后总结结果?@Gregor,是的,这是正确的。这就是我要寻找的,可能是一个滚动求和。我想如果你重新组织你的数据,你会发现这是一个容易得多的任务。谢谢@IceCreamToucan,我在运行df2时收到了这样一条错误消息:
在vecseq(f_uuuuu,len_uuuuu,if(allow.cartesian | notjoin | | anyDuplicated)中出错(f_uuu,
:你知道这意味着什么吗?当运行DF2i时,这是完全错误吗?也许你需要添加
,allow.cartesian=TRUE
(在
]之前)
)谢谢@IceCreamToucan这很有效。你知道我怎么才能只得到公司从未生产过的水果吗?例如:2018年,a公司第一次生产桃子,因此sum_事件(2018)=1?
df <-  cbind(df, c("0","0","1","2","4","4") 

company                                    fruit year      sum_occurrences
1 company_a                 peaches, apples; oranges 2010               0
2 company_b                 apples; oranges; bananas 2011               0
3 company_b                           oranges; pears 2014               1
4 company_a          bananas; apples; oranges; pears 2014               2
5 company_b                   apples; oranges; pears 2016               4
6 company_a bananas; apples; oranges; pears; peaches 2018               4       
# clean up column classes
df[] <- lapply(df, as.character)
df$year <- as.numeric(df$year)

library(data.table)
setDT(df)

# create separate column for vector of fruits, and year + 5 column
df[, fruit2 := strsplit(gsub(' ', '', fruit), ',|;')]
df[, year2 := year + 5]

# Self join so for each row of df, this creates one row for each time another  
# row is within the year range 
df2 <- df[df, on = .(year <= year2, year > year, company = company)
          , .(company, fruit, fruit2, i.fruit2, year = x.year)]

# For each row in the (company, fruit, year) group, check whether 
# the original fruits are  in the matching rows' fruits, and store the result
# as a logical vector. Then sum the list of logical vectors (one for each row).
df3 <- df2[, .(sum_occurrences = do.call(sum, Map(`%in%`, fruit2, i.fruit2)))
           , by = .(company, fruit, year)]

# Add sum_occurrences to original df with join, and make NAs 0
df[df3, on = .(company, fruit, year), sum_occurrences := i.sum_occurrences]
df[is.na(sum_occurrences), sum_occurrences := 0]

#delete temp columns
df[, `:=`(fruit2 = NULL, year2 = NULL)]
df


#      company                                    fruit year sum_occurrences
# 1: company_a                 peaches, apples; oranges 2010               0
# 2: company_b                 apples; oranges; bananas 2011               0
# 3: company_b                           oranges; pears 2014               1
# 4: company_a          bananas; apples; oranges; pears 2014               2
# 5: company_b                   apples; oranges; pears 2016               4
# 6: company_a bananas; apples; oranges; pears; peaches 2018               4