добавлять строки в фрейме данных по порядку и заполнять строки соответствующим образом - PullRequest
1 голос
/ 08 октября 2019

У меня есть очень большой фрейм данных, состоящий из серии действий и отметок времени действий.

Для воспроизводимости это похоже на вывод этого ...

df <- data.frame(1:10)
df[,1] = c("0", "1", "2", "3", "4", "0", "1", "2", "3", "4")
colnames(df) = c("Clock")
df$client = c("1")
df$action = c("0", "1", "0", "0", "0", "1", "1", "0", "1", "0")
df$experimenter = c("NP", "NP", "NP", "NP", "NP", "TU", "TU", "TU", "TU", "TU")

## output
   Clock client action experimenter
      0      1      0           NP
      1      1      1           NP
      2      1      0           NP
      3      1      0           NP
      4      1      0           NP
      0      1      1           TU
      1      1      1           TU
      2      1      0           TU
      3      1      1           TU
      4      1      0           TU

Как мне сделать следующее:

1) добавить строки между числами в столбце часов (на 1/4 секунды)?

2) заполнить данные соответствующим образом для ближайшегостолбец?

Вывод будет выглядеть примерно так ...

 Clock client action experimenter
      0      1      0           NP
      0.25   1      0           NP
      0.50   1      0           NP
      0.75   1      0           NP
      1      1      1           NP
      1.25   1      1           NP
      1.50   1      1           NP
      1.75   1      1           NP
      2      1      0           NP
      2.25   1      0           NP
      2.50   1      0           NP
      2.75   1      0           NP
      3      1      0           NP
      3.25   1      0           NP
      3.50   1      0           NP
      3.75   1      0           NP
      4      1      0           NP
      4.25   1      0           NP
      4.50   1      0           NP
      4.75   1      0           NP
      0      1      1           TU
      0.25   1      1           TU
      0.50   1      1           TU
      0.75   1      1           TU
      1      1      1           TU
      1.25   1      1           TU
      1.50   1      1           TU
      1.75   1      1           TU
      2      1      0           TU
      2.25   1      0           TU
      2.50   1      0           TU
      2.75   1      0           TU
      3      1      1           TU
      3.25   1      1           TU
      3.50   1      1           TU
      3.75   1      1           TU
      4      1      0           TU
      4.25   1      0           TU
      4.50   1      0           TU
      4.75   1      0           TU

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Основным решением R было бы повторить строки и затем добавить дроби в переменную Clock:

df2 <- df[rep(seq_len(nrow(df)), each=4),]
df2$Clock <- as.numeric(df2$Clock) + ((0:3)/4)
1 голос
/ 08 октября 2019

Мы можем использовать complete и fill после создания групп в данных. Для каждой группы мы создаем последовательность от минимального значения в Clock до максимального + 0,75, а затем fill всех отсутствующих значений по предыдущим значениям, отличным от NA.

library(dplyr)
library(tidyr)

df %>%
  mutate_at(1:3, as.numeric) %>%
  group_by(group = cumsum(c(TRUE, diff(Clock) < 0))) %>%
  complete(Clock = seq(min(Clock), max(Clock) + 0.75, by = 0.25)) %>% 
  ungroup() %>%
  select(-group) %>%
  fill(everything())

# A tibble: 40 x 4
#   Clock client action experimenter
#   <dbl>  <dbl>  <dbl> <chr>       
# 1  0         1      0 NP          
# 2  0.25      1      0 NP          
# 3  0.5       1      0 NP          
# 4  0.75      1      0 NP          
# 5  1         1      1 NP          
# 6  1.25      1      1 NP          
# 7  1.5       1      1 NP          
# 8  1.75      1      1 NP          
# 9  2         1      0 NP          
#10  2.25      1      0 NP          
# … with 30 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...