我试图找到这个简单问题的答案,但没有任何运气。
假设我有:
A <- c(1101,1102,1103)
以及如下所示的数据帧:
t m com x
1 1 1101 10
1 1 1102 15
1 1 1103 20
1 2 NA NA
1 3 1101 20
1 3 1102 25
1 3 1103 30
1 4 NA NA
1 5 1101 25
1 5 1102 30
1 5 1103 35
由于我想做的是 X 与 na.approx 的线性插值(实际数据帧和对象要大得多),我需要数据帧看起来像这样:
t m com x
1 1 1101 10
1 1 1102 15
1 1 1103 20
1 2 1101 NA
1 2 1102 NA
1 2 1103 NA
1 3 1101 20
1 3 1102 25
1 3 1103 30
1 4 1101 NA
1 4 1102 NA
1 4 1103 NA
1 5 1101 25
1 5 1102 30
1 5 1103 35
我还没有为此尝试任何代码,因为我不知道从哪里开始。
您认为有用的任何帮助和/或 r 材料都会很棒。
谢谢
您需要的功能是tidyr::complete()
。
- 由于您想在
m
组中"扩展"列com
,因此您需要先group_by(m)
, - 然后使用向量
A
complete
com
列。 - 在这种情况下,默认情况下,
t
列将填充NA
,我们可以使用上一行中的值fill()
列t
(因为您说您有一个大型数据集,这应该比在complete()
中设置fill
参数更好)。 - 然后删除
com
列中的任何NA
(这些是数据集中的原始NA
)。 - 最后,将列重新排序回其原始位置。
library(tidyverse)
A <- c(1101,1102,1103)
df %>%
group_by(m) %>%
complete(com = A) %>%
fill(t, .direction = "up") %>%
drop_na(com) %>%
select(t, m, com, x)
# A tibble: 15 x 4
# Groups: m [5]
t m com x
<int> <int> <dbl> <int>
1 1 1 1101 10
2 1 1 1102 15
3 1 1 1103 20
4 1 2 1101 NA
5 1 2 1102 NA
6 1 2 1103 NA
7 1 3 1101 20
8 1 3 1102 25
9 1 3 1103 30
10 1 4 1101 NA
11 1 4 1102 NA
12 1 4 1103 NA
13 1 5 1101 25
14 1 5 1102 30
15 1 5 1103 35