2016-04-17 70 views
0

我正在跟踪同行评议文献中许多研究领域的处理,并处理了近1500篇论文。在我的数据文件中,我有25个主题的列,在数据文件中注释1(存在)和0(不存在)。数据文件示意图如下所示:同时计算几个组的频率

TITLE AUTHORS JOURNAL YEAR ... TOPIC1 TOPIC2 TOPIC3 TOPIC4 ... TOPIC25 
'xxx' 'yyy' 'zzz' 2002   1  0  0  1   0 
'xxx' 'yyy' 'zzz' 2012   0  0  0  0   1 
'xxx' 'yyy' 'zzz' 2002   0  0  1  1   0 
'xxx' 'yyy' 'zzz' 2015   1  0  0  0   0 
'xxx' 'yyy' 'zzz' 2015   0  0  0  0   0 
'xxx' 'yyy' 'zzz' 2013   0  0  1  1   1 
'xxx' 'yyy' 'zzz' 2012   1  0  0  0   0 
'xxx' 'yyy' 'zzz' 2012   0  0  1  0   1 

我需要计算的各种主题的频率在报纸上,并用数据帧看起来像这样结束:

TOPIC count 
TOPIC1 7 
TOPICS2 19 
. 
. 
TOPIC25 15 

我一直在谷歌上搜索,阅读和尝试一些不同的东西,但迄今没有任何工作,因此没有发布代码。

任何帮助,不胜感激...

+1

是否预期输出反映输入示例?也许'lapply(df1 [grep(“^ TOPIC \\ d +”,names(df1))],sum)' – akrun

+0

我不确定你的意思,但名称并不是真正的TOPICS1:TOPIC25,但它们都有不同的名字 - > POPABU,POPTR,POPSTAT,HARV,CC,HAB,POLL,ZOO,PHYS,TEK等 – Dag

+0

如果是这种情况,您应该在示例中说明。如果你没有指定它,我们怎么知道你在数据中有'POPABU','POPTR'等。所以,如果你知道列索引,而不是'grep',你可以做'lapply(df1 [5:ncol(df1)],sum)' – akrun

回答

1

我们可以遍历感兴趣的列,得到sumstack它来创建一个两列“data.frame”。

res <- setNames(stack(lapply(df1[grep("^TOPIC\\d+", names(df1))], 
      sum))[2:1], c("TOPIC", "count")) 
head(res,2) 
# TOPIC count 
#1 TOPIC1  7 
#2 TOPIC2  19 

如果列名不具有任何的图案,使用列索引子集列,即假设,如果POPABU是第5列,POPGEN是最后一列,

res <- setNames(stack(lapply(df1[5:ncol(df1)], 
      sum))[2:1], c("TOPIC", "count")) 
+0

这是如何工作时,真正的主题名称在数据文件中是这样的:POPABU,POPTR,POPSTAT,HARV,CC,HAB,POLL ,ZOO,PHYS,TEK,HWC,DIS,ANA,POPGEN等? – Dag