问题
这个问题由两个部分组成。
--首先, --我有一个数据框架,其中包含列中的一些数字。看上去像这样。
> 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")。如果有不止一个重复,我希望它们被一个空格隔开。
期望输出
> View(df)
sr.no. num rep
1 1 x
2 0
3 2 x x
4 1 x
5 0我试着使用rep函数,但是它产生了一些错误,我不完全理解rep函数是如何工作的。我想我知道它的作用,但不知道怎么做.
> 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函数有关。
如果我写这个,
> rep(1:2,df$num)
Error in rep(1:2, df$num) : invalid 'times' argument我搞错了。但如果我写这个,
> rep(1:length(df$num),df$num)
[1] 1 3 3 4我得到了上面的输出。请有人向我解释一下,首先,如何解决我的重复问题;然后,为什么代表在一种情况下给错误,而在另一种情况下没有。
发布于 2016-01-11 07:47:39
由于您已经说过数据集相当大,使用apply函数可能需要时间来处理。相反,您可以使用库( stri_dup )和函数--在这种情况下,您将得到相同的输出,但速度更快。
所以用吧
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 发布于 2016-01-11 07:48:24
我们也可以使用data.table来完成这个任务。您提到的数据很大,我怀疑许多‘num’会多次出现在数据中。因此,创建每个“rep”字符串一次并使用快速包data.table将更快。
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上运行了一些基准测试。
#creating data
set.seed(123)
largedat <- data.frame(sr.no.=1:1e6, num=sample(0:50,1e5, replace=T))这些都是(不足为奇的)结果。
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发布于 2016-01-11 07:21:38
尝试:
> 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 0rep(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次)等。
https://stackoverflow.com/questions/34715754
复制相似问题