对包含R中特定字符串的行求和

时间:2015-01-30 08:53:39

标签: r plyr

我有一个数据框,其中第一列包含广告系列的名称。我需要总结广告系列名称包含某些字符串的所有行(它可以出现在名称中的不同位置,即有时在开头有时在最后)。数据框看起来像这样:

    Campaign          Impressions    
1   Local display     1661246 
2   Local text        1029724 
3   National display  325832 
4   National Audio    498900 
5   Audio local        597339 
6   TV Regional        597339
...  

所以在这种情况下,我想要总结包含" local"的所有行。在一排,"国家"进入一个区域"区域"进入一个等,像这样:

    Campaign     Impressions    
1   Local        939293929
2   National     9232423423
2   Regional     1123123123

如何实现这一目标?我一直在尝试使用ddply而没有成功......

3 个答案:

答案 0 :(得分:1)

您可以使用grep查找与Campaign列类别匹配的行(' Local',' National',' Regional&# 39;)在循环中(lapply)。根据{{​​1}}和grep“展示次数”对数据集(' df')进行子集设置。列和sum列表元素。

rbind

或使用res1 <- do.call(rbind,lapply(c('Local', 'National', 'Regional'), function(x) { x1 <- df[grep(x, df$Campaign, ignore.case=TRUE),] data.frame(Campaign= x, Impressions=sum(x1$Impressions))})) 。只保留&#39;本地&#39;,&#39;国家&#39;地区&#39;在&#39;类别&#39;使用data.table并将其用作&#34;分组&#34;变量以对列&#39;印象&#39;求和。

sub

数据

library(data.table)
setDT(df)[, list(Impressions=sum(Impressions)),by=
   list(Category=sub('.*?(Local|National|Region).*','\\U\\1', Campaign, 
   ignore.case=TRUE, perl=TRUE))]

答案 1 :(得分:0)

我想你应该使用grep函数:说你的data.frame被称为mydata然后

  

Local = grep(mydata $ Campaign,pattern =“Local”)

     

National = grep(mydata $ Campaign,pattern =“National”)

     

Regional = grep(mydata $ Campaign,pattern =“Regional”)

     

mydata_sum = data.frame(Campaign = c(“Local”,“National”,“Regional”),Impressions = c(sum(mydata $ Impressions [Local]),sum(mydata $ Impressions [National]),总和(MYDATA $印象[区域])))

答案 2 :(得分:0)

这是我使用dplyr的方法:

library(dplyr)
library(stringr)

categories <- "Local|National|Regional"

mydf %>% 
  mutate(Campaign = tolower(str_extract((Campaign), ignore.case(categories)))) %>%
  group_by(Campaign) %>%
  summarise(sum(Impressions))

我需要在提取字符串后添加tolower,以确保group_by组与“Local”一起“local”。