重复 data.frame 的每一行一列中指定的次数
df <- data.frame(var1 = c('a', 'b', 'c'), var2 = c('d', 'e', 'f'),
freq = 1:3)
扩展上面 data.frame 的前两列的每行,以便每行重复“freq”列中指定的次数,最简单的方法是什么?
换句话说,从这个:
df
var1 var2 freq
1 a d 1
2 b e 2
3 c f 3
到这个:
df.expanded
var1 var2
1 a d
2 b e
3 b e
4 c f
5 c f
6 c f
df <- data.frame(var1 = c('a', 'b', 'c'), var2 = c('d', 'e', 'f'),
freq = 1:3)
What is the simplest way to expand each row the first two columns of the data.frame above, so that each row is repeated the number of times specified in the column 'freq'?
In other words, go from this:
df
var1 var2 freq
1 a d 1
2 b e 2
3 c f 3
To this:
df.expanded
var1 var2
1 a d
2 b e
3 b e
4 c f
5 c f
6 c f
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
这是一种解决方案:
结果:
Here's one solution:
Result:
老问题,tidyverse 中的新动词:
old question, new verb in tidyverse:
使用
splitstackshape
包中的expandRows()
:语法简单,速度非常快,适用于
data.frame
或data.table.
结果:
Use
expandRows()
from thesplitstackshape
package:Simple syntax, very fast, works on
data.frame
ordata.table
.Result:
@neilfws 的解决方案非常适合
data.frame
,但不适用于data.table
,因为它们缺少row.names
属性。这种方法对两者都适用:data.table
的代码更加简洁:@neilfws's solution works great for
data.frame
s, but not fordata.table
s since they lack therow.names
property. This approach works for both:The code for
data.table
is a tad cleaner:另一种带有
slice
的 dplyr 替代方案,其中我们重复每个行号freq
次seq_len(n())
部分可以是替换为以下任何一项。Another
dplyr
alternative withslice
where we repeat each row numberfreq
timesseq_len(n())
part can be replaced with any of the following.我知道情况并非如此,但如果您需要保留原始的 freq 列,您可以将另一种
tidyverse
方法与rep
一起使用:创建于 2019-12 -21 由 reprex 包 (v0.3.0)
I know this is not the case but if you need to keep the original freq column, you can use another
tidyverse
approach together withrep
:Created on 2019-12-21 by the reprex package (v0.3.0)
如果您必须在非常大的 data.frames 上执行此操作,我建议将其转换为 data.table 并使用以下内容,它应该运行得更快:
看看这个解决方案有多快:
In case you have to do this operation on very large data.frames I would recommend converting it into a data.table and use the following, which should run much faster:
See how much faster this solution is:
另一种可能性是使用
tidyr::expand
:vonjd 的答案的单行版本:
由 reprex 包 (v0.2.1) 创建于 2019 年 5 月 21 日< /sup>
Another possibility is using
tidyr::expand
:One-liner version of vonjd's answer:
Created on 2019-05-21 by the reprex package (v0.2.1)
我正在为这个精彩答案的精彩线索提供又一个补充!使用
tidyr
包(包含在tidyverse
中)获得单行解决方案:I am providing one more addition to this wonderful thread of nice answers! Use the
tidyr
package (included intidyverse
) for a one-liner solution:实际上。使用向量和索引的方法。我们也可以达到同样的结果,并且更容易理解:
in fact. use the methods of vector and index. we can also achieve the same result, and more easier to understand: