Как сопоставить две строки столбца и отфильтровать значения сопоставленных столбцов - PullRequest
0 голосов
/ 10 июля 2020

У меня есть общий фрейм данных с данными о 1000 сотрудниках, в которых есть столбцы Срок полномочий и Месяц_счет, и я хочу сопоставить записи, где Месяц1 = 1, Месяц2 = 2, Месяц3 = 3 и Опытный = 4. Мне нужно отфильтровать только эти строки, если он совпадает.

name<-c(rep("Bob", 4),rep("Dick", 6),rep("Jack",5),rep("ryan",4))
name<-as.data.frame(name)
Tenure<-c("Month1","Month2","Month3","Experienced","Month2","Month3","Experienced",
          "Experienced","Experienced","Experienced","Month1","Month2","Month3","Experienced","Experienced","Experienced","Experienced","Experienced","Experienced")
Tenure<-as.data.frame(Tenure)
Month_count<-c(seq(1:4),seq(2,7,by=1),seq(1:5),seq(1:4))
Month_count<-as.data.frame(Month_count)
total<-cbind(name,Tenure,Month_count)


Входные и требуемые Выходные данные ниже

введите описание изображения здесь

Буду признателен, если есть какое-нибудь решение dplyr

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вы можете добавить условия в filter:

library(dplyr)
total %>%
  filter(Tenure == 'Month1' & Month_count == 1 | 
         Tenure == 'Month2' & Month_count == 2 |
         Tenure == 'Month3' & Month_count == 3 |
         Tenure == 'Experienced' & Month_count == 4)

#   name      Tenure Month_count
#1   Bob      Month1           1
#2   Bob      Month2           2
#3   Bob      Month3           3
#4   Bob Experienced           4
#5  Dick      Month2           2
#6  Dick      Month3           3
#7  Dick Experienced           4
#8  Jack      Month1           1
#9  Jack      Month2           2
#10 Jack      Month3           3
#11 Jack Experienced           4
#12 ryan Experienced           4

Или использовать то же самое в subset, чтобы сохранить его в базе R:

subset(total, Tenure == 'Month1' & Month_count == 1 | 
              Tenure == 'Month2' & Month_count == 2 |
              Tenure == 'Month3' & Month_count == 3 |
              Tenure == 'Experienced' & Month_count == 4)
0 голосов
/ 10 июля 2020

Мы можем сделать это автоматически с помощью Map

v1 <- c(paste0("Month", 1:3), "Experienced")
v2 <- 1:4
total[Reduce(`|`, Map(function(x, y) with(total,
             Tenure == x & Month_count ==y), v1, v2)),]
#   name      Tenure Month_count
#1   Bob      Month1           1
#2   Bob      Month2           2
#3   Bob      Month3           3
#4   Bob Experienced           4
#5  Dick      Month2           2
#6  Dick      Month3           3
#7  Dick Experienced           4
#11 Jack      Month1           1
#12 Jack      Month2           2
#13 Jack      Month3           3
#14 Jack Experienced           4
#19 ryan Experienced           4

Или используя tidyverse

library(dplyr)
library(purrr)
total %>% 
      filter(map2(v1, v2, ~ Tenure == .x & Month_count == .y) %>%
               reduce(`|`))
#    name      Tenure Month_count
#1   Bob      Month1           1
#2   Bob      Month2           2
#3   Bob      Month3           3
#4   Bob Experienced           4
#5  Dick      Month2           2
#6  Dick      Month3           3
#7  Dick Experienced           4
#8  Jack      Month1           1
#9  Jack      Month2           2
#10 Jack      Month3           3
#11 Jack Experienced           4
#12 ryan Experienced           4
...