按顺序在数据帧中添加行并适当填充行

时间:2019-10-08 00:18:20

标签: r

我有一个非常大的数据框,其中包含一系列动作和这些动作的时间戳。

为了可重复性,它看起来类似于此输出...

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)适当地为Near列填写数据?

输出看起来像这样...

 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 个答案:

答案 0 :(得分:1)

在数据中创建组后,我们可以使用completefill。对于每个组,我们创建一个从Clock的最小值到最大值+ 0.75的序列,然后按先前的非NA值fill所有丢失的值。

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

答案 1 :(得分:1)

R的基本解决方案是重复行,然后将分数添加到Clock变量中:

df2 <- df[rep(seq_len(nrow(df)), each=4),]
df2$Clock <- as.numeric(df2$Clock) + ((0:3)/4)