如何以下列方式在其他数据框之间添加行

时间:2018-03-20 11:09:30

标签: r dataframe

数据框看起来像这样(点应该是垂直点):

Class IncreasingNumber
"A"   3          <- row 1
"A"   5          <- row 2
...   ...
"A"   20         <-row 31
"B"   1          
"B"   2
... ...
"B"  41          <- row 63
"C"  1
......

有20个不同的课程。每个类中的行数等于31.

我想要做的很简单。对于每个类,我想在所有行之间插入3个新行。因此,我们希望在第1行和第2行之间插入3个新行,在第2行和第3行之间插入3个新行,在第30行和第31行之间最多可以插入3个新行。但是第31行之间没有新行和32,因为这些属于不同的类。

我们想为每个班级做这个。

我们插入的三行与其周围行具有相同的类,这三行的IncreaseNumber值只是周围点的IncreaseNumber值中的3个等间距点。

例如,对于第一个类,以及在第1行和第2行之间插入的前三行,我们看到IncreaseNumbers为3和5.

因此,我们插入的第一行的第一个值应为3.5。下一个值应为4.第三个值应为4.5。

所以我们应该为前两个类得到这样的东西:

Class IncreasingNumber
"A"   3          
"A"   3.5        <- new row
"A"   4          <- new row
"A"   4.5        <- new row
"A"   5          
...   ...
"A"   20         
"B"   1    
"B"   1.25       <- new row
"B"   1.5        <- new row
"B"   1.75       <- new row
"B"   2
... ...
"B"  41          
"C"  1

2 个答案:

答案 0 :(得分:4)

您可以使用approx及其n参数插入点。使用Jaap的数据:

library(data.table)    
setDT(df)
df[ , approx(inc.num, n = (.N - 1) * 4 + 1), by = classes]
#     classes    x     y
#  1:       A 1.00  3.00
#  2:       A 1.25  3.50
#  3:       A 1.50  4.00
#  4:       A 1.75  4.50
#  5:       A 2.00  5.00
#  6:       A 2.25  5.25
#  7:       A 2.50  5.50
#  8:       A 2.75  5.75
#  9:       A 3.00  6.00
# 10:       A 3.25  7.00
# 11:       A 3.50  8.00
# 12:       A 3.75  9.00
# 13:       A 4.00 10.00
# 14:       B 1.00  1.00
# 15:       B 1.25  1.25
# 16:       B 1.50  1.50
# 17:       B 1.75  1.75
# 18:       B 2.00  2.00
# 19:       B 2.25  4.00
# 20:       B 2.50  6.00
# 21:       B 2.75  8.00
# 22:       B 3.00 10.00 

答案 1 :(得分:3)

使用* - 包的可能解决方案:

data.table

给出:

library(data.table)

setDT(df)[, .(inc.num.new = unique(c(mapply(function(x, y) seq(from = x, to = y, length.out = 5),
                                            head(inc.num,-1), tail(inc.num,-1)))))
          , by = classes]

使用过的数据:

    classes inc.num.new
 1:       A        3.00
 2:       A        3.50
 3:       A        4.00
 4:       A        4.50
 5:       A        5.00
 6:       A        5.25
 7:       A        5.50
 8:       A        5.75
 9:       A        6.00
10:       A        7.00
11:       A        8.00
12:       A        9.00
13:       A       10.00
14:       B        1.00
15:       B        1.25
16:       B        1.50
17:       B        1.75
18:       B        2.00
19:       B        4.00
20:       B        6.00
21:       B        8.00
22:       B       10.00