如何插入 NA 行以填充列以创建完整的连续数据集
How to insert NA rows to fill column to create complete continuous dataset
我目前有数据集:
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
我很难为每个类别估算所有数据行。
非常感谢所有帮助。
也许您可以使用 "tidyverse" 中的 complete
或 expand
以及 full_join
:
尝试:
library(tidyverse)
mydf %>% complete(Time = full_seq(Time, 1), Cat)
或:
mydf %>%
expand(Time = 1:7, Cat) %>%
full_join(mydf) %>%
arrange(Cat, Time)
要考虑的替代函数是 base 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)]
基础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
我目前有数据集:
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
我很难为每个类别估算所有数据行。
非常感谢所有帮助。
也许您可以使用 "tidyverse" 中的 complete
或 expand
以及 full_join
:
尝试:
library(tidyverse)
mydf %>% complete(Time = full_seq(Time, 1), Cat)
或:
mydf %>%
expand(Time = 1:7, Cat) %>%
full_join(mydf) %>%
arrange(Cat, Time)
要考虑的替代函数是 base 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)]
基础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