如何计算字符串值的频率(来自同一列中的几个ID)? [R]

How to count frequency of string value (from a few ID in the same column)? [R]

我想清理我的 table,但由于我还是 [R] 的新手,我能做的非常有限。 list其实挺长的,100000行左右,我手动是不可能的~求大神帮忙

假设我有一个很长的 table 形式的数据列表。他们每个人都有一个 "Publication.Code" 和一个 "Date"。代码是唯一的,而日期可以重复。对于其中的每一个,他们在 "Type".

列下都有一个 "names" 的列表
Publication.Code    Date        Type
1   AC00069535742   2009-04-16  E62D 21/15;E60R 7/06;E60R 21/06;E62D 25/14
2   BB000069535652  2008-10-30  F06Q 10/
3   FV000069434701  2007-04-05  E30B 15/;E30B 15/16
4   RG000069534443  2006-07-06  E62D 21/15;E62D 25/14;T60T 7/06;E60R 21/06
5   MV000069333663  2006-02-23  H04N 1/1;G01J 3/51
6   KK000069533634  2006-02-23  H12N 9/1;H12N 15/54;H12P 9/
7   NQ000069534198  2006-02-16  H12N 15/54;H12N 15/7;H12N 1/21;H12N 9/1

我想使用每个名称的第一个 4 个字母 改变一个新列(即 E60R、E62D、F06Q、E30B、T60T、H04N、 G01J, H12N) 在 "Type" 列中并计算其在名称列表中的频率,如下所示:

Publication.Code    Date        E60R E62D F06Q E30B T60T H04N G01J H12N
1   AC00069535742   2009-04-16  2    2    1    0    0    0    0    0
2   BB000069535652  2008-10-30  0    0    1    0    0    0    0    0
3   FV000069434701  2007-04-05  0    0    0    2    0    0    0    0
4   RG000069534443  2006-07-06  1    2    0    0    1    0    0    0
5   MV000069333663  2006-02-23  0    0    0    0    0    1    1    0
6   KK000069533634  2006-02-23  0    0    0    0    0    0    0    3
7   NQ000069534198  2006-02-16  0    0    0    0    0    0    0    4

在那之后,我想按年份总结一下,也许是:

Year        E60R E62D F06Q E30B T60T H04N G01J H12N
1   2009    2    2    1    0    0    0    0    0
2   2008    0    0    1    0    0    0    0    0
3   2007    0    0    0    2    0    0    0    0
4   2006    1    2    0    0    1    1    1    7

&还有每列的累计和:

Year        E60R E62D F06Q E30B T60T H04N G01J H12N
1   2009    2    2    1    0    0    0    0    0
2   2008    2    2    2    0    0    0    0    0
3   2007    2    2    2    2    0    0    0    0
4   2006    2    4    2    2    1    1    1    7

我知道我可以使用 dplyr 改变列并按年份计算频率,但我不确定如何从列中提取特定值,非常感谢寻求帮助~

如果您将类型放入向量 myTypes 中,这应该适用于问题的第一部分

require(plyr) 
require(stringr)
df<-read.table(header = TRUE, sep=",", text="
Publication.Code,    Date,        Type
AC00069535742,   2009-04-16,  E62D 21/15;E60R 7/06;E60R 21/06;E62D 25/14
BB000069535652,  2008-10-30,  F06Q 10/")
myTypes <- c("E60R", "E62D", "F06Q", "E30B", "T60T", "H04N", "G01J", "H12N")
res <- adply(df, .margin = 1, .fun = function(x) setNames(str_count(x$Type, pattern = myTypes), myTypes))
res$Type <- NULL

这将解决第二部分

res$Date <-lubridate::ymd(res$Date)
ddply(res, .(year(Date)), function(x)colSums(x[,-(1:2)]))

要计算每列的累积值,请使用 cumsum in colwise

names(res2)[1] <-"year"
cbind(year = res2$year, colwise(cumsum, myTypes)(res2))