这个问题包含两部分。
首先,我有一个数据框,其中包含一些列中的数字。它看起来像这样。
// cdst is the image
// This is the code which i want to know what are the values in a certain pixel but the code below only detects the first then the 2nd and 3rd is equal to 0
void dec()
{
Mat em;
cdst="path of the image";
//this is the value of BGR per color that i wish to check
Vec3f red(0, 0, 255);
Vec3f blue(255, 0, 0);
Vec3f green(0, 128, 0);
Vec3f yellow(0, 255, 255);
Vec3f marron(0, 0,128);
Vec3f pink(147, 20, 255);
Vec3f indigo(130, 0, 75);
Vec3f midblue(112, 25, 25);
Vec3f magenta(139, 0, 139);
//em will hold the cdst image
em=cdst;
//for loop to determine what are the colors
for (int i = 0; i < l.size(); i++)
{
int x = l[i][0];
int y = l[i][1];
cout << x << " " << y<<endl;
Vec3f px = em.at<uchar>(y,x);
//Im trying to print all color of the 3 channels
//But it only the first on has a value then the second and third is 0
cout << px.val[0] << " " << px.val[1] << " "<<px.val[2]<<endl;
if (px == pink)
{
cout<<"A";
}
}
}
现在,我希望根据数据框第1列中的数字重复固定值(比如文本“x”)。如果有多个重复,我希望它们用空格分隔。
> 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
我尝试使用rep函数,但它给出了一些错误,我不完全理解rep函数的工作原理。我想我知道它的作用,但不知道'怎么样'..
> View(df)
sr.no. num rep
1 1 x
2 0
3 2 x x
4 1 x
5 0
注意:实际数据框很大,因此我们不能手动创建“x”列表。
现在,第二部分与我上面的问题无关,但它只与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'
我收到错误。但如果我写这个,
> rep(1:2,df$num)
Error in rep(1:2, df$num) : invalid 'times' argument
我得到了上面的输出。有人可以向我解释,首先是如何解决我的重复问题;然后,如果代表在一个案例中给出错误而另一个案件没有出现错误,那该怎么回事。
答案 0 :(得分:3)
我们也可以使用data.table来做到这一点。你提到的数据很大,我怀疑很多人的数据很多。将多次出现在数据中。因此,创建每个代表&#39;只使用一次字符串并使用快速包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
出于兴趣,并且因为速度/性能是一个问题,我在一百万行的数据集上运行了一些基准测试。
#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
答案 1 :(得分:2)
尝试:
> 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 :(得分:2)
由于您已经说过数据集非常大,因此使用apply函数可能需要一些时间来处理。 相反,你可以使用 库(stringi) 和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