我有一个看起来像这样的数据集
Category<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
Sequence<-c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)
Data<-c(2,3,4,5,6,4,5,6,7,6,5,4,3,2,4)
DF<-data.frame(Category,Sequence,Data)
我想通过在Sequence列中填充其他数字(保持Category不变)来平滑数据列(线性插值)。如果我在每个值之间填充序列只有一个数字,结果将如下所示:
NewCat<-c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2)
NewSeq<-c(1,1.5,2,2.5,3,3.5,4,4.5,5,1,1.5,2,2.5,3,3.5)
NewData<-c(2,2.5,3,3.5,4,4.5,5,5.5,6,4,4.5,5,5.5,6,6.5)
NewDF<-data.frame(NewCat,NewSeq,NewData)
我已经编写了一个for循环来执行此操作(使用20而不是一个填充),但我想使用更高效的东西。
答案 0 :(得分:2)
我认为这可以使用approx
函数在Base R中执行您想要的操作。根据需要更改Interval
的值。它使用tapply
为Category
的每个值构建一个新数据框,使用新的Sequence
序列和插值Data
,然后将它们绑定在一起。忽略行名称。
Interval <- 0.5
NewDF <- do.call(rbind,
tapply(seq_along(DF$Sequence), DF$Category, function(x) {
Seqvals <- seq(min(DF$Sequence[x]), max(DF$Sequence[x]), Interval)
Intvals <- approx(DF$Sequence[x], DF$Data[x], Seqvals)$y
return(data.frame(Category=DF$Category[min(x)],
Sequence=Seqvals,
Data=Intvals))}))
NewDF
Category Sequence Data
1.1 1 1.0 2.0
1.2 1 1.5 2.5
1.3 1 2.0 3.0
1.4 1 2.5 3.5
1.5 1 3.0 4.0
1.6 1 3.5 4.5
1.7 1 4.0 5.0
1.8 1 4.5 5.5
1.9 1 5.0 6.0
2.1 2 1.0 4.0
2.2 2 1.5 4.5
2.3 2 2.0 5.0
2.4 2 2.5 5.5
2.5 2 3.0 6.0
2.6 2 3.5 6.5
2.7 2 4.0 7.0
2.8 2 4.5 6.5
2.9 2 5.0 6.0
3.1 3 1.0 5.0
3.2 3 1.5 4.5
3.3 3 2.0 4.0
3.4 3 2.5 3.5
3.5 3 3.0 3.0
3.6 3 3.5 2.5
3.7 3 4.0 2.0
3.8 3 4.5 3.0
3.9 3 5.0 4.0