Суммирование по строкам, содержащим определенные строки в 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
...
Так что в этом случае я хочу суммировать все строки, содержащие "local" в одну строку, "national" в одну, "Regional" в одну и т. Д., Например:
Campaign Impressions
1 Local 939293929
2 National 9232423423
2 Regional 1123123123
Как этого достичь? Я пытался с ddply без успеха....
3 ответа
Вы могли бы использовать grep
чтобы найти строки, которые соответствуют Campaign
категории столбцов ("Местный", "Национальный", "Региональный") в цикле (lapply
). Подмножество набора данных ('df') на основе grep
а также 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
затем
Local = grep(mydata$Campaign, pattern = "Local")
Национальный = grep(mydata$Campaign, pattern = "National")
Региональный = grep (mydata $ Campaign, pattern = "Regional")
mydata_sum = data.frame (Campaign = c ("Local", "National", "Regional"), Impressions = 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".