我想按组对数据框中的值进行插值,以使每个组具有相同数量的数据点。
到目前为止,我已经尝试了关于expand()和na.approx()函数的一些事情,但是没有成功。
通过一个示例最容易理解:我想转换此数据框:
> df.test
ID x y
1 A 0 9.0
2 A 2 8.0
3 B 10 1.0
4 B 20 1.5
5 B 30 3.0
对此
> df.test.result
# A tibble: 10 x 3
ID x y
<fct> <dbl> <dbl>
1 A 0 9
2 A 0.5 8.75
3 A 1 8.5
4 A 1.5 8.25
5 A 2 8
6 B 10 1
7 B 15 1.25
8 B 20 1.5
9 B 25 2.25
10 B 30 3
这个想法是在A和B组中分别创建5个数据点,其中缺失的y值由线性插值确定。例如,对于组“ B”,它应该在x = 15,x = 25(已经有10,20,30的位置)处进行插值以获得5分。为了获得x = 15,它应该线性内插最接近的数据点的y值(在这种情况下,x = 10和x = 20)。并且在此示例中x = 15位于两者的中间,这将得出(x,y)=(15,1.25)。
首先,我扩展了组(以接收y列中的NA以便稍后插入)
df.test.expand <- df.test %>%
group_by(ID) %>%
expand(x=full_seq(x,1)) %>%
ungroup() %>%
left_join(df.test)
但是x列总是增加1,而每个组的样本量却不相同(例如5个元素)。
还有其他更直接的方法可以执行此插值吗?
我想这是一个普遍的问题,在dplyr中应该很简单。
感谢您的帮助!
一种可能是:
df %>%
group_by(ID) %>%
summarise_all(~ list(seq(first(.), last(.), len = 5))) %>%
unnest()
ID x y
<chr> <dbl> <dbl>
1 A 0 9
2 A 0.5 8.75
3 A 1 8.5
4 A 1.5 8.25
5 A 2 8
6 B 10 1
7 B 15 1.5
8 B 20 2
9 B 25 2.5
10 B 30 3
要执行线性插值(也使用zoo
):
df %>%
group_by(ID) %>%
complete(x = seq(first(x), last(x), len = 5)) %>%
mutate(y = na.approx(y))
ID x y
<chr> <dbl> <dbl>
1 A 0 9
2 A 0.5 8.75
3 A 1 8.5
4 A 1.5 8.25
5 A 2 8
6 B 10 1
7 B 15 1.25
8 B 20 1.5
9 B 25 2.25
10 B 30 3
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句