[英]Summing over rows containing particular strings in R
我有一个数据框,其中第一列包含广告系列的名称。 我需要汇总广告系列名称包含某些字符串的所有行(它可以出现在名称中的不同位置,即有时出现在开头,有时出现在结尾)。 数据框看起来像这样:
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
...
因此,在这种情况下,我想将包含“本地”的所有行汇总为一行,将“国家”汇总为一行,将“区域”汇总为一行,如下所示:
Campaign Impressions
1 Local 939293929
2 National 9232423423
2 Regional 1123123123
如何做到这一点? 我一直在尝试ddply,但没有成功。
您可以使用grep
在循环( lapply
)中找到与Campaign
列类别(“ Local”,“ National”,“ Regional”)匹配的行。 根据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))}))
或使用data.table
。 仅在“类别”中使用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))]
df <- structure(list(Campaign = c("Local display", "Local text",
"National display",
"National Audio", "Audio local", "TV Regional"), Impressions =
c(1661246L, 1029724L, 325832L, 498900L, 597339L, 597339L)), .Names =
c("Campaign", "Impressions"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
我猜你应该使用grep
函数:比如说你的data.frame
叫做mydata
本地= grep(mydata $ Campaign,模式=“本地”)
国家= grep(mydata $ Campaign,模式=“国家”)
区域= grep(mydata $ Campaign,模式=“区域”)
mydata_sum = data.frame(广告系列= c(“本地”,“国家”,“区域”),印象数= c(sum(mydata $ Impressions [Local]),sum(mydata $ Impressions [National]),sum(mydata $印象[区域])))
这是我使用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”一起分组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.