Удалить строки, если они имеют две метки - PullRequest
0 голосов
/ 29 сентября 2019

Наличие фрейма данных:

dframe <- structure(list(id = c(1L, 1L, 1L, 1L), name = c("Amazon", "Google", 
"Google", "Yahoo"), label = c("pre", "after", "pre", "after"), 
    text_sth = c("other", "another one test text_sth another text", 
    "another text other", "another one test text_sth another text"
    )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-4L))

Как можно сохранить строки, которые содержатся только в метке столбца до и после, для каждого идентификатора пользователя, обнаруживаемого в каждом имени.Пример ожидаемого результата:

 id name   label text_sth                                               
1 Google after another one test text_sth another text
1 Google pre   another text other  

Ответы [ 3 ]

3 голосов
/ 29 сентября 2019

Используя tidyverse, вы можете применять условия отдельно к группам во фрейме данных.Мы можем использовать функцию filter() в сочетании с тем фактом, что в некоторых случаях TRUE рассматривается как 1, а FALSE как ноль.Функция max() применяется внутри групп.

library(tidyverse)
dframe %>%
  group_by(id, name) %>%
  filter(max(label=="pre")==1, 
         max(label=="after")==1)
1 голос
/ 29 сентября 2019

Мы можем использовать all, чтобы проверить, присутствуют ли все требуемые значения в группе

library(dplyr)

dframe %>%
  group_by(id, name) %>%
  filter(all(c("pre", "after") %in% label))

#     id name   label text_sth                              
#  <int> <chr>  <chr> <chr>                                 
#1     1 Google after another one test text_sth another text
#2     1 Google pre   another text other    

Мы можем реализовать ту же логику в базе R

subset(dframe, as.logical(ave(label, id, name, FUN = function(x) 
                         all(c("pre", "after") %in% x))))  

или двапути в data.table

library(data.table)
setDT(dframe)
dframe[dframe[, .I[all(c("pre", "after") %in% label)], by = .(id, name)]$V1]
#OR
dframe[, .SD[all(c("pre", "after") %in% label)], by = .(id, name)]
0 голосов
/ 29 сентября 2019

Мы можем использовать

library(dplyr)
dframe %>%
  group_by(id, name) %>%
  filter(length(intersect(c("pre", "after"), label)) == 2)

Или с data.table

library(data.table)
setDT(dframe)[, .SD[length(intersect(c("pre", "after"), label)) ==2], 
           .(id, name)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...