首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中重复某个值、不同次数的值

在R中重复某个值、不同次数的值
EN

Stack Overflow用户
提问于 2016-01-11 06:57:02
回答 3查看 3.2K关注 0票数 2

问题

这个问题由两个部分组成。

--首先, --我有一个数据框架,其中包含列中的一些数字。看上去像这样。

代码语言:javascript
复制
> df <- data.frame(sr.no.=c(1,2,3,4,5),num=c(1,0,2,1,0))
> View(df)
  sr.no.    num
  1         1         
  2         0
  3         2
  4         1
  5         0

现在,我希望根据数据帧第一列中的数字重复一个固定值(例如文本"x")。如果有不止一个重复,我希望它们被一个空格隔开。

期望输出

代码语言:javascript
复制
> View(df)
  sr.no.    num     rep
  1         1       x
  2         0       
  3         2       x x
  4         1       x
  5         0

我试着使用rep函数,但是它产生了一些错误,我不完全理解rep函数是如何工作的。我想我知道它的作用,但不知道怎么做.

代码语言:javascript
复制
> rep("x",df$num)
Error in rep("x", df$num) : invalid 'times' argument
> rep("x",df[df$num])
Error: (list) object cannot be coerced to type 'integer'

注意:实际数据框架很大,所以我们不能手动创建'x‘列表。

现在,第二个部分与我上面的问题无关,但它只与rep函数有关。

如果我写这个,

代码语言:javascript
复制
> rep(1:2,df$num)
Error in rep(1:2, df$num) : invalid 'times' argument

我搞错了。但如果我写这个,

代码语言:javascript
复制
> rep(1:length(df$num),df$num)
[1] 1 3 3 4

我得到了上面的输出。请有人向我解释一下,首先,如何解决我的重复问题;然后,为什么代表在一种情况下给错误,而在另一种情况下没有。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-11 07:47:39

由于您已经说过数据集相当大,使用apply函数可能需要时间来处理。相反,您可以使用库( stri_dup )和函数--在这种情况下,您将得到相同的输出,但速度更快。

所以用吧

代码语言:javascript
复制
library(stringi)

cbind(df,rep=stri_dup("x ",df$num))

  sr.no. num  rep
1      1   1   x 
2      2   0     
3      3   2 x x 
4      4   1   x 
5      5   0     
票数 2
EN

Stack Overflow用户

发布于 2016-01-11 07:48:24

我们也可以使用data.table来完成这个任务。您提到的数据很大,我怀疑许多‘num’会多次出现在数据中。因此,创建每个“rep”字符串一次并使用快速包data.table将更快。

代码语言:javascript
复制
setDT(dat)[,rep:=paste(rep("x",num),collapse=" "),by=num]
dat

> dat
   sr.no. num rep
1:      1   1   x
2:      2   0    
3:      3   2 x x
4:      4   1   x
5:      5   0    

出于兴趣,而且由于速度/性能的问题,我在有一百万行的dataset上运行了一些基准测试。

代码语言:javascript
复制
#creating data
set.seed(123)
largedat <- data.frame(sr.no.=1:1e6, num=sample(0:50,1e5, replace=T))

这些都是(不足为奇的)结果。

代码语言:javascript
复制
Unit: milliseconds
     expr         min          lq        mean      median          uq         max neval cld
   heroka    20.49455    25.44678    34.85443    32.00066    44.51929    57.99193    20 a  
   Krrish   206.14323   272.43439   370.22651   377.10149   467.71401   518.09284    20  b 
 fishtank 12740.56664 12896.42906 13417.82434 13223.84195 13931.15781 14605.41123    20   c
票数 3
EN

Stack Overflow用户

发布于 2016-01-11 07:21:38

尝试:

代码语言:javascript
复制
> df$rep<-apply(df,1,function(x){ paste(rep("x",x["num"]),collapse=" ")})
> df
  sr.no num rep
1     1   1   x
2     2   0
3     3   2 x x
4     4   1   x
5     5   0

rep(1:2,df$num),因为df$num有5个数字,而1:2只有2个数字,所以rep不知道要重复多少次1:2。

rep(1:length(df$num),df$num基本上是rep(c(1,2,3,4,5),c(1,0,2,1,0)),所以它知道重复1 (1次),2次(0次),3次(2次)等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34715754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档