数据框看起来像这样(点应该是垂直点):
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
答案 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