grep множественные шаблоны или условие группировки данных - PullRequest
0 голосов
/ 31 августа 2018

У меня есть данные, сгруппированные по данным,

df <- data.frame(group_id= c(1, 1, 1, 1, 2, 1, 2, 3, 4),
                words = c("beach", "sand", "trip", "warm","travel", "water","beach","sand", "trees"),
                 ID = c("vacation", "vacation", "vacation", "vacation", "meeting","vacation","meeting","onduty", "hiking"))

group_id - это группы столбца ID. Теперь я хочу проверить определенные шаблоны («пляжный» или «теплый» или «песочный») для каждой группы и распечатать соответствующий шаблон в отдельном столбце, а совпадения 0 (нет совпадений) или 1 (да совпадения) в отдельном столбце.

Ожидается:

  id  words       ID           pattern Match
1  1  beach vacation Beach, sand, warm 1
2  1   sand vacation Beach, sand, warm 1
3  1   trip vacation Beach, sand, warm 1
4  1   warm vacation Beach, sand, warm 1
5  2 travel  meeting Beach             1
6  1  water vacation Beach, sand, warm 1
7  2  beach  meeting Beach             1
8  3   sand   onduty sand              1
9  4  trees  hiking  0                 0

Ответы [ 4 ]

0 голосов
/ 31 августа 2018

Я использовал dplyr grep, чтобы получить желаемый результат. Ниже приведен код:

library(dplyr) 

pattern <- c("Beach", "sand", "warm")
df <- data.frame(group_id= c(1, 1, 1, 1, 2, 1, 2, 3, 4),
                 words = c("beach", "sand", "trip", "warm","travel", "water","beach","sand", "trees"),
                 ID = c("vacation", "vacation", "vacation", "vacation", "meeting","vacation","meeting","onduty", "hiking"))

x <- df %>%
  group_by(group_id) %>%
  summarise(words = paste(words, collapse = " "))
y <- sapply(pattern, function(d) grep(paste0("\\b",d,"\\b"),x$words , ignore.case = T))
y <- setNames(unlist(y, use.names=F),rep(names(y), lengths(y)))
y <- data.frame(Match_pattern =names(y), group_id=y, row.names=NULL)
y <- y %>%
  group_by(group_id) %>%
  summarise(Match_pattern = paste(Match_pattern, collapse = ", "))

out <- merge(df, y, by = "group_id", all.x = T)
out$N <- ifelse(is.na(out$Match_pattern), 0, 1)

> out
  group_id  words       ID     Match_pattern N
1        1   sand vacation Beach, sand, warm 1
2        1   trip vacation Beach, sand, warm 1
3        1   warm vacation Beach, sand, warm 1
4        1  beach vacation Beach, sand, warm 1
5        1  water vacation Beach, sand, warm 1
6        2  beach  meeting             Beach 1
7        2 travel  meeting             Beach 1
8        3   sand   onduty              sand 1
9        4  trees   hiking              <NA> 0
0 голосов
/ 31 августа 2018

Вы можете попробовать следующее. Найдите значения unique для group_id, которые связаны с ключом words. Подмножество df с использованием [].

df[df$group_id %in% unique(df$group_id[df$words %in% c('beach', 'sand', 'warm')]),]

  group_id  words       ID
1        1  beach vacation
2        1   sand vacation
3        1   trip vacation
4        1   warm vacation
5        2 travel  meeting
6        1  water vacation
7        2  beach  meeting
8        3   sand   onduty
0 голосов
/ 31 августа 2018

Использование sqldf: Сначала выберите group_id с words ('beach','sand','warm'), а затем выберите все значения из этих group_id.

library(sqldf)
sqldf("select * from df where group_id IN(select group_id from df where words IN ('beach','sand','warm'))")

Выход:

    group_id  words   ID
1        1  beach vacation
2        1   sand vacation
3        1   trip vacation
4        1   warm vacation
5        2 travel  meeting
6        1  water vacation
7        2  beach  meeting
8        3   sand   onduty
0 голосов
/ 31 августа 2018
ids <- df$ID[ grepl("^(beach|warm|sand)$",df$words) ]

df[df$ID %in% ids,]

#  group_id  words       ID
#1        1  beach vacation
#2        1   sand vacation
#3        1   trip vacation
#4        1   warm vacation
#5        2 travel  meeting
#6        1  water vacation
#7        2  beach  meeting
#8        3   sand   onduty
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...