2014-09-18 66 views
0

我是R新手,因此请原谅我,如果我错过了一些协议,但这里是我的问题: 我正在创建临时向量以便在需要时添加'0'。我最终想要一个由12位数组成的值,如果情况并非如此,我将添加我需要的'0'值。但是,试图贴上我的临时指数与相应的零之后,我得到以下信息:不允许使用不适用

colnames(ALLMBRS) <- c("SSN","tracts","GeoBlock","GeoCodeBlck","GeoMatch") #TA Members Tracts 
#Remove special characters and decimals 
tmp1 <- str_replace_all(ALLMBRS$GeoCode,"[[:punct:]]","") 
#Temporary Vector of ALLMBRS 
tmp2 <- tmp1 
#Vectors of Indices used to add 0's 
add1 <- str_length(ALLMBRS$tracts) == 11 
add2 <- str_length(ALLMBRS$tracts) == 10 
add3 <- str_length(ALLMBRS$tracts) == 9 
add4 <- str_length(ALLMBRS$tracts) == 8 
add5 <- str_length(ALLMBRS$tracts) == 7 
#Paste temporary vector indices into temporary vector 
tmp2[add1] <- paste(tmp2[add1],"0",sep="") 
tmp2[add2] <- paste(tmp2[add2],"00",sep="") 
tmp2[add3] <- paste(tmp2[add3],"000",sep="") 
tmp2[add4] <- paste(tmp2[add4],"0000",sep="") 
tmp2[add5] <- paste(tmp2[add5],"00000",sep="") 

数据示例:

[1] "0"   "0"   "0"   "0"   "0"   "0"   
[7] "0"   "360010146121" "720210310133" "0"   "517100023001" "90034808002" 
[13] "250158202021" "250158211004" "250138125003" "290470203002" "250138124031" "250158202033" 
[19] "250138019012" "250138112002" 

我希望所有的值包含12位。所以,我想看到

[1]000000000000 

[12]900348080020 

Error Message: Error in tmp2[add1] <- paste(tmp2[add1],"0",sep = ""): 
NAs are not allowed in subscripted assignments 

如果我有NA在我的数据我怎么能绕过这个,所以我可以完成我的任务。 谢谢你的帮助。

回答

1

您可以使用stringr中的str_pad填充字符串。在pad参数设置为"0"

> x <- c("0", "0", "0", "0", "0", "0", "0", "360010146121", 
     "720210310133", "0", "517100023001", "90034808002", 
     "250158202021", "250158211004", "250138125003", 
     "290470203002", "250138124031", "250158202033", 
     "250138019012", "250138112002") 
> library(stringr) 
> str_pad(x, 12, pad = "0") 
# [1] "000000000000" "000000000000" "000000000000" "000000000000" 
# [5] "000000000000" "000000000000" "000000000000" "360010146121" 
# [9] "720210310133" "000000000000" "517100023001" "090034808002" 
#[13] "250158202021" "250158211004" "250138125003" "290470203002" 
#[17] "250138124031" "250158202033" "250138019012" "250138112002" 

更新:对于含有任何NA值向量,你可以做

x[!is.na(x)] <- str_pad(x[!is.na(x)], 12, pad = "0") 

垫的价值观和离开的NA不变。例如,

> y <- c("0", NA, "123", "68") 
> y[!is.na(y)] <- str_pad(y[!is.na(y)], 12, pad = "0") 
> y 
# [1] "000000000000" NA    "000000000123" "000000000068" 
+0

谢谢理查德。我收到一条错误消息:'无效的时间值'。这是否会因为我将NA作为一些价值观? – user3067851 2014-09-24 16:33:57

+0

@ user3067851我刚试过,是的,它似乎是这样。试试'x [!is.na(x)] < - str_pad(x [!is.na(x)],12,pad =“0”);看看是否有效。如果这对您有用,我会更新答案。 – 2014-09-24 16:36:12