Как обновить значения с именами столбцов с условием в R? - PullRequest
0 голосов
/ 08 мая 2020

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

Note: This is the sample data of my data.
data:
id user   time1    time2    time3  
1  user1  07:52    08:34    08:43
2  user2  08:14    10:09    10:22
3  user3  07:43    09:29    09:44
4  user4  09:36    10:34    11:05

Теперь я хочу проверить, сколько активных пользователей доступно в 09:36. Я написал условие, как показано ниже, чтобы получить активных пользователей в момент времени 09: 36.

for(k in 1:nrow(data)){
   k=4
   active_users_data <- subset(data,(data$time2 < data$time1[k] &
                                  data$time3> data$time1[k]))
}
output :
id user   time1    time2    time3  
3  user3  07:43    09:29    09:44

Но мне нужен выходной формат, как показано ниже:

id time1    time2    time3  user1   user2   user3  user4 
3  07:43    09:29    09:44    0       0       1      0

То есть, если при этом активен user3 момент времени мне нужно получить 1 в столбце user3. Как я могу добиться результата, как указано выше? Если в этот момент активны два пользователя, мне нужно получить 1 столбец соответствующих пользователей. Пожалуйста, предложите мне идеи. Я должен сделать это для большого набора данных.

1 Ответ

0 голосов
/ 08 мая 2020

идеально подходит для tidyverse

library(tidyverse)
k=as.POSIXct(strptime("09:36", "%H:%M"))
df %>% 
  mutate_at(vars(contains("time")), ~as.POSIXct(strptime(., "%H:%M"))) %>% 
  mutate(t2 = ifelse(time2 < k & time3 > k, 1, 0)) %>% 
  spread(user, t2, fill = 0)
  id               time1               time2               time3 user1 user2 user3 user4
1  1 2020-05-08 07:52:00 2020-05-08 08:34:00 2020-05-08 08:43:00     0     0     0     0
2  2 2020-05-08 08:14:00 2020-05-08 10:09:00 2020-05-08 10:22:00     0     0     0     0
3  3 2020-05-08 07:43:00 2020-05-08 09:29:00 2020-05-08 09:44:00     0     0     1     0
4  4 2020-05-08 09:36:00 2020-05-08 10:34:00 2020-05-08 11:05:00     0     0     0     0

Я преобразовал время в дату (может быть лучший вариант, но я не эксперт по датам), наконец, я использовал распространение, чтобы сделать данные широкий.

...