Если используется элемент, выберите следующий из вектора в R - PullRequest
1 голос
/ 26 февраля 2020

Я довольно плохо знаком с R и, к сожалению, не могу найти ответ на приведенную ниже проблему.

У меня есть набор данных:

df <- data.frame(room = rep("room1.", 6),
                 name = c("piet", "klaas", "Sara", "mo.", "piet", "jo"),
                 time = c("9:00", "9:00", "12:00", "14:00", "14:00", "14:00"))
df
#>     room  name  time
#> 1 room1.  piet  9:00
#> 2 room1. klaas  9:00
#> 3 room1.  Sara 12:00
#> 4 room1.   mo. 14:00
#> 5 room1.  piet 14:00
#> 6 room1.    jo 14:00

и вектор:

pcs <- c("pc1", "pc2", "pc3")

Я хочу добавить столбец pc, в который на основе оператора if добавляется элемент вектора. Если pc пусто, добавьте первый элемент из вектора в столбец pc, но если значение в time уже использовано, выберите следующий элемент.

желаемый результат:

room   name  time  pc
room1. piet  9:00  pc1
room1. klaas 9:00  pc2
room1. Sara  12:00 pc1
room1. mo.   14:00 pc1
room1. piet  14:00 pc2
room1. jo    14:00 pc3

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

Вот базовое решение R, использующее ave

dfout <- within(df,pc <- ave(seq(nrow(df)),time,FUN = function(v) pcs[seq_along(v)]))

, такое, что

> dfout
    room  name  time  pc
1 room1.  piet  9:00 pc1
2 room1. klaas  9:00 pc2
3 room1.  Sara 12:00 pc1
4 room1.   mo. 14:00 pc1
5 room1.  piet 14:00 pc2
6 room1.    jo 14:00 pc3

ДАННЫЕ

df <- structure(list(room = c("room1.", "room1.", "room1.", "room1.", 
"room1.", "room1."), name = c("piet", "klaas", "Sara", "mo.", 
"piet", "jo"), time = c("9:00", "9:00", "12:00", "14:00", "14:00", 
"14:00")), class = "data.frame", row.names = c(NA, -6L))
1 голос
/ 26 февраля 2020

Вот решение dplyr:

library(dplyr)
df %>% group_by(time) %>% mutate(pc = pcs[1:n()]) %>% ungroup()
## A tibble: 6 x 4
#  room   name  time  pc
#  <fct>  <fct> <fct> <chr>
#1 room1. piet  9:00  pc1
#2 room1. klaas 9:00  pc2
#3 room1. Sara  12:00 pc1
#4 room1. mo.   14:00 pc1
#5 room1. piet  14:00 pc2
#6 room1. jo    14:00 pc3
0 голосов
/ 26 февраля 2020

А вот решение data.table:

library(data.table)

setDT(df) # convert df from data.frame to data.table
df[, pc := pcs[1:.N], by = time] 

df
#>      room  name  time  pc
#> 1: room1.  piet  9:00 pc1
#> 2: room1. klaas  9:00 pc2
#> 3: room1.  Sara 12:00 pc1
#> 4: room1.   mo. 14:00 pc1
#> 5: room1.  piet 14:00 pc2
#> 6: room1.    jo 14:00 pc3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...