我有数据集(比方说)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
}
可以做些什么的任何想法?
答案 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]次等等。
在我们的示例中,x
为c(0,0,0,0)
,times
为c(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='')