rep()函数使用变量'times'会引发错误

时间:2016-09-20 20:17:27

标签: r

我有数据集(比方说)test <- data.frame(x = c(90, 801, 6457, 92727), y = rep("test", 4)) print(test) x y 1 90 test 2 801 test 3 6457 test 4 92727 test

test$z

我想创建反映test$x的变量test$z,除了print(test) x y z 1 90 test 0000000090 2 801 test 0000000801 3 6457 test 0000006457 4 92727 test 0000092727 总是10个字符长,用零填充空白。因此,结果数据框将如下所示:

test$z <- paste0(as.character(rep(0, 10-nchar(as.character(test$x)))), as.character(test$x))

我认为下面的函数会给我我想要的结果:

rep

但它在test$z函数中取消了以下错误:

  

rep中的错误(0,10-nchar(as.character(test $ x))):
        无效的'次'参数

有关使用rep功能或任何其他解决方案获取export enum BagType{ Canvas, Paper } 可以做些什么的任何想法?

3 个答案:

答案 0 :(得分:4)

问题源于rep(0, 10-nchar(as.character(test$x))),其中第二个参数是一个向量,即times参数。基本上,这会引发错误:

rep(0, c(9, 8, 7, 4))

相反,你应该这样做:

rep(c(0,0,0,0), c(9, 8, 7, 4))

其中两个向量的长度相同。

?rep声明:

  

如果时间由一个整数组成,则结果包括重复多次的整个输入。如果时间是与x相同长度的向量(在每个复制后),则结果包括x [1]重复次数[1]次,x [2]重复次数[2]次等等。

在我们的示例中,xc(0,0,0,0)timesc(9, 8, 7, 4)

你可以这样做:

test$z <- sapply(test$x, function(x) paste0(paste0(rep(0,10-nchar(x)),collapse = ""),x))

#      x    y          z
#1    90 test 0000000090
#2   801 test 0000000801
#3  6457 test 0000006457
#4 92727 test 0000092727

答案 1 :(得分:2)

@Roland在评论中提到sprintf(),这是一个好主意。 @ m0h3n在他的回答中用rep()解释了这个问题。这是两者的替代方案。

您可以使用新的基本函数rep()替换strrep(),这将使x参数的长度为times。它似乎很适合你的情况。

strrep(0, 10 - nchar(test$x))
# [1] "00000000" "0000000"  "000000"   "00000"   

所以我们只是将其粘贴到test$x的正面,我们就完成了。不需要任何as.character强制,因为它都是在内部完成的。

paste0(strrep(0, 10 - nchar(test$x)), test$x)
# [1] "0000000090" "0000000801" "0000006457" "0000092727"

注意:strrep()是在R版本3.3.1中引入的。

答案 2 :(得分:2)

到目前为止,你有几个很好的答案。

为了好玩,这里有一个快速而又肮脏的例子。使用您可能已经知道的功能来实现它的方法。

test$z <- substr(paste0('0000000000', as.character(test$x)),
                 nchar(test$x),
                 10+nchar(test$x))

只需将每个条目和子字符串粘贴到比您需要(例如10)更多的零。

P.S。您可以使用长度 n 的字符串替换上面代码中的零字符,而不是写入:

paste0(rep(0, n), collapse='')