首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从现有数据框架中每两个连续行中的值创建数据框架

从现有数据框架中每两个连续行中的值创建数据框架
EN

Stack Overflow用户
提问于 2018-03-26 20:57:52
回答 1查看 88关注 0票数 1

我有数据帧z1

代码语言:javascript
复制
z1 <- data.frame(time=as.factor(rep(0.5:9.5,times=rep(c(9,10,8,11,12),2))),
            roi= rep(c(1:9,1:10,1:8,1:11,1:12),2), area=runif(100, 5.0, 7.5))

我想要创建一个新的数据框架,z2有带有条件的10*nrow(z1)行:在每个time值处,i in 1: c(nrow(z1) -1)的第二行(z1$roi[i:i+1] and z1$area[i:i+1])用于在z2中生成roiarea,如下所示

代码语言:javascript
复制
z2$roi <- seq(z1$roi[i],z1$roi[i+1], length.out = 10)
z2$area <- seq(z1$area[i],z1$area[i+1], length.out = 10)

如果数据帧z1看起来像:

代码语言:javascript
复制
    time roi     area
1    0.5   1 6.181150    #=z1$roi[1]
2    0.5   2 5.469366    #=z1$roi[2]
3    0.5   3 6.742525
.
.
.
98   9.5  10 6.063234
99   9.5  11 6.824393    #=z1$roi[99]
100  9.5  12 7.346298    #=z1$roi[100]

数据框架z2将是:

代码语言:javascript
复制
     time  roi      area
1     0.5 1.000000 6.181150     #=z1$roi[1]
2     0.5 1.111111 6.102063
.
.
.
9     0.5 1.888889 5.548453
10    0.5 2.000000 5.469366     #=z1$roi[2]
.
.
.
991   9.5 11.00000 6.824393     #=z1$roi[99]
992   9.5 11.11111 6.882383
.
.
.
999   9.5 11.88889 7.288309
1000  9.5 12.00000 7.346298     #=z1$roi[100]

有谁可以帮我?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-03-26 23:47:58

您可以使用approx()将其作为线性插值问题来处理。

代码语言:javascript
复制
s1 <- seq_len(nrow(z1)-1)
s2 <- rep(s1,each=9)

out <- approx(
  x    = seq_along(z1$area),
  y    = z1$area,
  xout = c(s2 + head(seq(0,1,length.out=10),-1), nrow(z1))
)$y

z1

#  time roi     area
#1  0.5   1 6.413124
#2  0.5   2 6.837422
#3  0.5   3 6.656612

然后使用行索引将结果重新组合起来:

代码语言:javascript
复制
cbind(z1[c(s2,nrow(z1)),], out)

#    time roi     area      out
#1    0.5   1 6.413124 6.413124
#1.1  0.5   1 6.413124 6.460268
#1.2  0.5   1 6.413124 6.507413
#1.3  0.5   1 6.413124 6.554557
#1.4  0.5   1 6.413124 6.601701
#1.5  0.5   1 6.413124 6.648845
#1.6  0.5   1 6.413124 6.695989
#1.7  0.5   1 6.413124 6.743134
#1.8  0.5   1 6.413124 6.790278
#2    0.5   2 6.837422 6.837422
#2.1  0.5   2 6.837422 6.817332
#2.2  0.5   2 6.837422 6.797242
#2.3  0.5   2 6.837422 6.777152
#2.4  0.5   2 6.837422 6.757062
#2.5  0.5   2 6.837422 6.736972
#2.6  0.5   2 6.837422 6.716882
#2.7  0.5   2 6.837422 6.696792
#2.8  0.5   2 6.837422 6.676702
#3    0.5   3 6.656612 6.656612

这种逻辑应该比为每一行计算一个序列要好得多。从一个快速而肮脏的测试中,1百万行的10秒到1分钟的顺序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49500472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档