Как получить уникальные строки с условием в r? - PullRequest
1 голос
/ 24 марта 2020

У меня есть фрейм данных, как показано ниже.

d1:
user  time1   time2   time3
u1    07:00   07:15   07:20
u1    07:10   07:30   07:55
u2    07:20   08:00   08:10
u3    07:30   08:05   08:20

Если время (столбец времени из другого фрейма данных) равно 07: 45 . Мне нужно получить уникальные пользовательские строки с состояние time3 > time. Фрейм данных d1 меняет столбец времени по сравнению с другим фреймом данных. В новом фрейме данных мне нужно получить уникальных пользователей без повторений.

I have tried like below:
for(i in 1:nrow(d1)){
  if(d1$user[i] != d1$user[i+1]){
    d2 <- d1[which(d1$time3 > "07:45"),]
}
}

Я получаю сообщение об ошибке, когда оно доходит до последнего строка из-за условия if. Но I have to check if any user repeated in the user column and with condition time3>time.

Expected output :

user  time1   time2   time3
u1    07:10   07:30   07:55
u2    07:20   08:00   08:10
u3    07:30   08:05   08:20

Я знаю, что у меня плохое состояние, но я не понимаю, как достичь вышеуказанного результата?

Ответы [ 2 ]

0 голосов
/ 24 марта 2020
library(lubridate) # for hm function to compare times

last_unique <- length(d1$user)-match(unique(d1$user),rev(d1$user))+1
rows <- which(last_unique == which(hm(d1$time3) > hm("07:45")))

Получить строки, в которых последнее уникальное значение также больше 07: 45

d2 <- d1[last_unique[rows],]

Подмножество уникального пользователя и время больше 07: 45

Для В случае, если вы хотите выбрать самое последнее уникальное значение ранее , чем указанное время, просто измените лог c:

d1 <- read.table(text = "
user,time1,time2,time3
u1,07:05,07:10,07:25
u1,07:20,07:30,07:40
u2,07:20,08:00,08:10
u3,07:30,08:05,08:20
u4,07:10,07:15,07:20
u4,07:25,07:30,07:35", sep = ',', header = TRUE)

rows <- which(hm(d1$time3) < hm("07:45")) 
temp <- d1[rows,]
last_unique <- length(temp$user)-match(unique(temp$user),rev(temp$user))+1

d2 <- temp[last_unique,]
d2
  user time1 time2 time3
2   u1 07:20 07:30 07:40
6   u4 07:25 07:30 07:35
0 голосов
/ 24 марта 2020

И если вы попробуете что-то вроде этого:

d1$test <- c(diff(d1$user, lag = 1), NA)
d2 <- d1[d1$test == 0 & d1$time3 > "07:45", ]

Я предложил создать новый столбец, чтобы проверить, равен ли каждый пользователь следующему, и оставить в d2 только пользователей, повторенных и со временем. > tham 07: 45.

Надеюсь, это поможет вам!

...