【问题标题】:How to insert NA rows to fill column to create complete continuous dataset如何插入 NA 行以填充列以创建完整的连续数据集
【发布时间】:2017-12-20 14:09:20
【问题描述】:

我目前有数据集:

Time Var1 Var2 Cat
1    14   16   1
2    16   98   1
4    52   68   1
7    17   12   1
1    57   58   2
3    45   35   2 
4    33   12   2
7    77   1    2

并希望能够为每个类别创建连续的时间变量,如下所示:

   Time Var1 Var2 Cat
    1    14   16   1
    2    16   98   1
    3    NA   NA   1
    4    52   68   1
    5    NA   NA   1
    6    NA   NA   1
    7    17   12   1
    1    57   58   2
    2    NA   NA   2
    3    45   35   2 
    4    33   12   2
    5    NA   NA   2
    6    NA   NA   2
    7    77   1    2

我正在努力推算每个类别的所有数据行。

非常感谢所有帮助。

【问题讨论】:

  • data.table 解决方案:library(data.table); d1 <- setDT(df)[, .(Time = seq(min(Time), max(Time))), by = Cat]; df[d1, on = names(d1)] - 取自我的问题/答案here

标签: r na fill missing-data continuous


【解决方案1】:

R解决方案:

df <- read.table(text = "Time Var1 Var2 Cat
1    14   16   1
2    16   98   1
4    52   68   1
7    17   12   1
1    57   58   2
3    45   35   2 
4    33   12   2
7    77   1    2", header = T)

df2 <- expand.grid(Time = 1:7, Cat = 1:2)

df3 <- merge(df, df2, by = c("Time", "Cat"), all = T)
df3 <- df3[order(df3$Cat, df3$Time), c(1, 3, 4, 2)]

> df3
   Time Var1 Var2 Cat
1     1   14   16   1
3     2   16   98   1
5     3   NA   NA   1
7     4   52   68   1
9     5   NA   NA   1
11    6   NA   NA   1
13    7   17   12   1
2     1   57   58   2
4     2   NA   NA   2
6     3   45   35   2
8     4   33   12   2
10    5   NA   NA   2
12    6   NA   NA   2
14    7   77    1   2

【讨论】:

  • 简单但按我的意愿完成工作
【解决方案2】:

也许您可以使用类似“tidyverse”中的completeexpand 以及full_join

试试:

library(tidyverse)
mydf %>% complete(Time = full_seq(Time, 1), Cat)

或者:

mydf %>% 
  expand(Time = 1:7, Cat) %>% 
  full_join(mydf) %>% 
  arrange(Cat, Time)

要考虑的替代函数是基础 R 中的 expand.grid,“data.table”中的 CJ,然后是 merge

这是一个带有“data.table”的示例(类似于@Sotos 的建议):

setDT(mydf)[with(mydf, CJ(Time = min(Time):max(Time), Cat = unique(Cat))), 
            on = c("Time", "Cat")][order(Cat, Time)]

【讨论】:

  • 使用df %&gt;% complete(Time = 1:7, Cat) 会更容易一些,但可能是重复的
  • @docendodiscimus,我刚刚想到,但首先想到的是扩展,因为我正在考虑 expand.grid + merge 方法。
猜你喜欢
  • 2023-01-07
  • 2020-07-17
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2022-12-29
  • 1970-01-01
  • 2015-01-11
相关资源
最近更新 更多