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

时间:2016-04-17 10:37:48

标签: r string dataframe time-series data-cleaning

我想清理我的桌子,但由于我还是[R]的新手,我能做的事情非常有限。该列表实际上很长,大约100,000行,我不可能手动执行〜请帮助我。

假设我有一个很长的表格数据列表。他们每个人都有一个" Publication.Code"和"日期"。该代码是唯一的,而日期可以重复。对于每一个,他们都有一个"名称列表"列#34;键入"。

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 )在列"类型"并将其频率计入名称列表中,如下所示:

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 来改变列并按年份计算频率,但我不确定如何从列中提取某些值,真的很感激任何帮助〜

1 个答案:

答案 0 :(得分:0)

如果你将你的类型放入矢量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

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