Выбор строк с соответствующими значениями - PullRequest
1 голос
/ 26 сентября 2019

У меня есть набор данных, подобный следующему.С субъектами, которые со временем объединяются в группы


df <- data.frame("group" = c("A", "A", "A+1","A+1", "A+1", "B","B+1","B+1"), 
                 "id" = c("id1", "id2", "id1", "id2", "id3", "id5","id5","id1"), 
                 "time" = c(1,1,3,3,3,2,5,5),
                 "Val" = c(10,10,10,10,10,12,12,12),
                  "groupid" = c("A", "A", "A","A", "A", "B","B","B"))

Моя конечная цель - добавить все значения, группирующиеся по идентификатору.

Моя проблема заключается в том, что, например, при присоединении новой группы субъекта к группе «А» группа «А + 1», когда субъект «id3» присоединяется в момент времени 3, все мои наблюдения дублируются («А+1 "включают" id1 "и" id2 ". Следовательно, я не могу сделать свою сумму.

В сумме я хотел бы удалить дублированные" идентификаторы "на основе идентификаторов" идентификатора группы ".
окончательный вариантdf должен выглядеть следующим образом


final <- data.frame("group" = c("A", "A", "A+1", "B","B+1"), 
                 "id" = c("id1", "id2", "id3", "id5","id1"), 
                 "time" = c(1,1,3,2,5),
                 "Val" = c(10,10,10,12,12),
                 "groupid" = c("A", "A", "A", "B","B"))

Заранее большое спасибо за вашу помощь


Последующий вопрос

У меня также есть противоположный случай, когда некоторыесубъект со временем покидает группу. Набор данных выглядит примерно так:

df2 <- data.frame("group" = c("A", "A", "A","A_1", "A_1", "B","B","B_1"), 
                 "id" = c("id1", "id2", "id3", "id2", "id3", "id5","id1","id1"), 
                 "time" = c(1,1,1,3,3,2,2,5),
                 "Val" = c(10,10,10,10,10,12,12,12),
                 "groupid" = c("A", "A", "A","A", "A", "B","B","B"))

В этом случае один субъект «id1» покидает «группу A», которая становится группой «A_1», где только «id2»и «id3» являются членами. Точно так же «id5» покидает группу B, которая становится «B_1» с только id1 в качестве члена.

То, что я хотел бы иметь в окончательном наборе данных, - это идентификация групп противоположного типа, котораядолжен выглядеть примерно так:

final2 <- data.frame("group" = c("A", "A", "A","A_1", "B","B","B_1"), 
                     "id" = c("id1", "id2", "id3", "id1", "id5","id1","id5"), 
                     "time" = c(1,1,1,3,2,2,5),
                     "Val" = c(10,10,10,10,12,12,12),
                     "groupid" = c("A", "A", "A","A", "B","B","B"))

. При этом "A_1" и "B_1 "указывают только на предметы," id1 "и" id5 "соответственно, которые покинули группу, а не на оставшихся.

Есть предложения по этому подходу?

Заранее благодарю за помощь

1 Ответ

2 голосов
/ 26 сентября 2019

Вот один из вариантов.После группировки по 'id' удалите подстроку 'group, начиная с +, за которой следуют одно или несколько чисел (\\d+) до конца ($) строки, примените duplicated к подстроке длясоздайте логический вектор внутри filter для удаления дублирующихся строк

library(dplyr)
df %>% 
   group_by(id) %>% 
   filter(!duplicated(str_remove(group, "\\+\\d+$")))
# A tibble: 5 x 5
# Groups:   id [4]
#  group id     time   Val groupid
#  <fct> <fct> <dbl> <dbl> <fct>  
#1 A     id1       1    10 A      
#2 A     id2       1    10 A      
#3 A+1   id3       3    10 A      
#4 B     id5       2    12 B      
#5 B+1   id1       5    12 B      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...