我想重复data.frame的行,每次 N
次 . 结果应该是一个新的 data.frame
(带有 nrow(new.df) == nrow(old.df) * N
)来保持列的数据类型 .
N = 2的示例:
A B C
A B C 1 j i 100
1 j i 100 --> 2 j i 100
2 K P 101 3 K P 101
4 K P 101
因此,每行重复2次,字符仍然是字符,因素仍然是因素,数字仍然是数字,...
我使用的第一次尝试适用: apply(old.df, 2, function(co) rep(co, each = N))
,但是这个将我的值转换为字符,我得到:
A B C
[1,] "j" "i" "100"
[2,] "j" "i" "100"
[3,] "K" "P" "101"
[4,] "K" "P" "101"
10 回答
添加到@dardisco提到的有关
mefa::rep.data.frame()
的内容,它非常灵活 .你可以 repeat each row N times :
或者 repeat the entire dataframe N times (想一想:当你回收矢量化参数时)
两个竖起大拇指
mefa
!我从来没有听说过它,我不得不写手动代码来做到这一点 .一个干净的
dplyr
解决方案,取自here如果你可以重复整个事情,或者先将它子集,然后再重复一遍,那么this similar question可能会有所帮助 . 再来一次:
或者干脆
rep.row函数似乎有时会为列创建列表,这会导致错误的内存hijink . 我写了以下似乎运作良好的:
有关引用并添加到引用mefa的答案,如果您不想包含整个包,可能需要查看
mefa::rep.data.frame()
的实现:我的解决方案与
mefa:::rep.data.frame
类似,但速度更快,关心行名称:比较方案:
有一个可爱的矢量化解决方案,每个行只能重复n次,例如可以在数据框中添加
ntimes
列:方法:
结果:
这与Josh O'Brien和Mark Miller的方法非常相似:
但是,该方法显得相当慢:
结果:
尝试使用例如
作为一个指标
另一种方法是先获取行索引,附加df的额外副本,然后按索引排序:
虽然其他解决方案可能更短,但该方法在某些情况下可能更有利 .