我们在最后的注释中添加了一个value2
列,df
以表明这适用于其他列。
请注意,这df
不是时间序列,na.approx
旨在对时间序列进行操作。要将其转换为一个,将其读入 zoo 对象wide0
,然后将其与一组完整的天数合并。现在我们可以na.approx
像讨论的那样直接申请。
library(magrittr)
library(zoo)
wide <- df %>%
read.zoo(index = "day", split = "trt") %>%
merge(zoo(, start(.):end(.) + 0)) %>%
na.approx
给予:
> wide
value.A value2.A value.B value2.B
1 7.00 1.00 5.000000 5.000000
2 9.50 1.50 5.250000 5.250000
3 12.00 2.00 5.500000 5.500000
4 10.25 2.25 5.750000 5.750000
5 8.50 2.50 6.000000 6.000000
6 6.75 2.75 7.666667 6.333333
7 5.00 3.00 9.333333 6.666667
8 6.00 NA 11.000000 7.000000
9 7.00 NA 8.000000 8.000000
上面的 NA 是由于在两边都没有值的情况下无法进行插值;但是,na.approx
如果您愿意,确实有其他参数可以填写。
上面显示的每个变量/组具有单独列的宽格式可能是最方便的,但如果不是,我们可以使用将其转换回长格式,fortify.zoo
并可能再次将变量分散到一列中。
library(tidyr)
wide %>%
fortify.zoo(wide, melt = TRUE, sep = ".",
names = list("day", c("variable", "group"), "value")) %>%
spread(variable, value)
给予:
day group value value2
1 1 A 7.000000 1.000000
2 1 B 5.000000 5.000000
3 2 A 9.500000 1.500000
4 2 B 5.250000 5.250000
5 3 A 12.000000 2.000000
6 3 B 5.500000 5.500000
7 4 A 10.250000 2.250000
8 4 B 5.750000 5.750000
9 5 A 8.500000 2.500000
10 5 B 6.000000 6.000000
11 6 A 6.750000 2.750000
12 6 B 7.666667 6.333333
13 7 A 5.000000 3.000000
14 7 B 9.333333 6.666667
15 8 A 6.000000 NA
16 8 B 11.000000 7.000000
17 9 A 7.000000 NA
18 9 B 8.000000 8.000000
笔记
可重现形式的输入。我们添加了一value2
列以显示它仍然有效。
df<-data.frame(trt=c("A", "A", "A", "A", "B", "B", "B", "B"),
day = c(1,3,7,9,1,5,8,9),
value = c(7,12,5,7,5,6,11,8),
stringsAsFactors=FALSE)
df$value2 <- c(1:3, NA, 5:8)