我有一个数据框,例如 5 行,用于 2 个可观察值。我需要在数据框中插入“虚拟”或“零”行,以便每个可观察的行数相同(并且可以大于 N 行,以获得更长的行数)。例如。:
# This is what I have:
x = c("a","a","b","b","b")
y = c(2,4,5,2,6)
dft = data.frame(x,y)
print(dft)
x y
1 a 2
2 a 4
3 b 5
4 b 2
5 b 6
这就是我想要得到的,即将每个可观察的 N 行添加到 4。 模拟df
x1 = c("a","a","a","a","b","b","b","b")
y1 = c(2,4,0,0,5,2,6,0)
dft1 = data.frame(x1,y1)
print(dft1)
x1 y1
1 a 2
2 a 4
3 a 0
4 a 0
5 b 5
6 b 2
7 b 6
8 b 0
我首先获取每个可观察的原始数据帧中的 N 行ddply
,这样我就知道需要为每个可观察值添加多少行。
library(plyr)
nr = ddply(dft,.(x),summarise,val=length(x))
print(nr)
x val
1 a 2
2 b 3
# N extras will be 2 and 1 to reach 4 per obs.
repl = 4 - nr$val
repl_name = nr$x
repl_x = rep(repl_name,repl)
print(repl_x)
[1] a a b
Levels: a b
dfa = matrix("-",nrow=sum(repl),ncol=1)
dff = data.frame(repl_x,as.data.frame(dfa))
names(dff) <- names(dft)
dft = rbind(dft,dff)
dft = dft[order(as.character(dft$x)),]
print(dft)
x y
1 a 2
2 a 4
6 a -
7 a -
3 b 5
4 b 2
5 b 6
8 b -
我确实实现了我的目标,但需要进行相当多的操作和转变。
所以,问题 - 有没有更简单、更快的插入方法随意的中的空/虚拟行数several放置在任何数据框中。列数和行数可以是任意的。
注意:上面的代码有效,所以我相信这个问题不是“检查我的代码”类型,而是一个真正的“如何做得更好”的问题。谢谢你!