Суммирование по строкам, содержащим определенные строки в 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".

Другие вопросы по тегам