如何拆分值以在R中创建具有额外行的数据框

时间:2015-08-27 20:43:28

标签: r

我有一个数据框,如:

a  b
1  3
2  2
3  0
4  1
5  0

这里我有5行,想要分割数据,以便我有10行,例如:

a   b 
1   1.5
2   1.5
3   1
4   1
5   0
6   0
7   0.5
8   0.5
9   0
10  0

我有大约450个这样的数据集,它们的长度各不相同,并且所有长度都不同,例如,第一个是107行,但我想分割数据,使其变为250行长,第二行是275行,我想将它拆分为333行。

有没有人知道允许我在R中执行此操作的公式?

3 个答案:

答案 0 :(得分:2)

data.frame(a=seq(nrow(df)*2), b=rep(df$b/2,each=2))
   a   b
1   1 1.5
2   2 1.5
3   3 1.0
4   4 1.0
5   5 0.0
6   6 0.0
7   7 0.5
8   8 0.5
9   9 0.0
10 10 0.0

答案 1 :(得分:0)

您可以这样做的一种方法是在原始数据框中创建一个新变量:

df $ b2 = df $ b / 2

然后创建一个新的数据框并附加旧的数据框:

df2< - df

df2< - rbind(df2,df)

然后你可以摆脱原来的b2变量,如果你喜欢

df2 $ b< - NULL

答案 2 :(得分:0)

因此,我会猜测你需要做什么才能进行不规则的调整,但要保持原始解决方案的特性。

如果我们将元素视为步进函数中的增量,那么我们可以使用approx函数从cumsum进行线性插值,然后使用diff来恢复原件

代码看起来像

resize.interpolate <- function(data, new.length) {
    l <- length(data)
    diff(approx(0:l/l, c(0, cumsum(data)), 0:new.length/new.length)$y)
}

一些例子

> df <- data.frame(a=1:5, b=c(3,2,0,1,0))
> resize.interpolate(df$b, 7)
[1] 2.1428571 1.7142857 1.1428571 0.0000000 0.5714286 0.4285714 0.0000000
> resize.interpolate(df$b, 10)
 [1] 1.5 1.5 1.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0

要将它们组合在一起,你可以

df2 <- data.frame(a=1:7, b=resize.interpolate(df$b, 7))