我有一个数据框,其中第一列包含广告系列的名称。我需要总结广告系列名称包含某些字符串的所有行(它可以出现在名称中的不同位置,即有时在开头有时在最后)。数据框看起来像这样:
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而没有成功......
答案 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”。