2016-07-15 48 views
0

我使用SUBSTR切断从字符串列表中的最后三个字母:postal_code0R:SUBSTR()的结果在不同的for循环和矢量

postal_code0 
>[1] "n14BE" "n14BE" "n14BE" "n14BE" "n14BE" "N16DD" "N16DD" "N16DD" "N16DD" "N16DD" 
>[11] "N11TW" "N11TW" "N11TW" "N11TW" "N11TW" "n5"  "N160LU" "N2"  "N200AU" "N200AU" 
>[21] "london" "n15"  "N5"  ""  

> outcode <- substr(postal_code0, 1, nchar(postal_code0)-3) 
> outcode 
[1] "n1" "n1" "n1" "n1" "n1" "N1" "N1" "N1" "N1" "N1" "N1" "N1" "N1" "N1" "N1" 
[16] ""  "N16" ""  "N20" "N20" "lon" ""  ""  ""  

它完全消除了一些元素,我想喜欢保持,但如果我使用循环的相同功能,它会返回我想要的结果。

> outcode0 <- c() 
> for (i in 1: length(postal_code0)){ 
+ outcode0[i] <- substr(postal_code0[i], 1, nchar(postal_code0)-3) 
+ } 

> outcode0 
[1] "n1" "n1" "n1" "n1" "n1" "N1" "N1" "N1" "N1" "N1" "N1" "N1" "N1" "N1" "N1" "n5" "N1" "N2" "N2" "N2" "lo" 
[22] "n1" "N5" "" 

这两个函数有什么区别?以及如何获得

outcode0 

没有使用for循环?

+3

什么是你想要的输出?你想保留每个字符串的前两个字符吗?如果是这样,请尝试'substr(postal_code0,1,2)'。 – nicola

+0

(1)我可能会考虑'substring'和'substr'的​​参数的向量化性质之间的差异,(2)读'substr'的​​Note部分并查看函数' strtrim'。 – joran

+0

好,事情是:substr(c(“n5”,“n5”),1,nchar(postal_code0)-3)也返回“n5”,“n5”。当我用一个变量名称向量替换时,它只是不会返回相同的结果 – Chumoon

回答

2

根据你最后留下的评论,下面应该做的:

len <- nchar(postal_code0) 
substring(postal_code0, 1, ifelse(len <= 3, len, len - 3)) 
+0

I我不能确定所问的问题是否合理,一个四字符串的头部应该返回多少个字符?3或1? – JWLM

+0

由于@Chumoon有兴趣从末尾移除3个字符,所以我解释它的方式如果它少于3个字符,那么整个字符串将被返回。我同意这个问题可以更清楚一点。 – thepule

+0

@thepule谢谢你的答案。我没有意识到substr()仅在nchar() – Chumoon