2015-08-08 20 views
5

sayısal bir vektör içinde basamak sayısını hesaplar. Bu durumda, 9 ve 81 numaralarından itibaren komut, bu durumda 1 ve 2 döndürecektir. Bunu yapmak için uygun bir yolu var mı? Ayrıca, sonuç 1 ise, iki basamağa nasıl genişleyebilirim? Örneğin, ben bir iade vektörI R sayısal bir vektör var R

c(0.90, 0.81) 
+1

deneyin 'biçimi' Do "sayısal" sınıf olarak mı dönmek istiyorsunuz? Konsolda 'yuvarlak (v1,2)' – akrun

+0

Tip 'v' ve' 0.90' ve '0.81' olacaktır. Vektör, tüm elemanları, vektördeki herhangi bir sayıdaki en yüksek sayıdaki basamaklarla otomatik olarak yazdırır. –

cevap

3
x <- c(0.9,0.81,32.52,0); 
nchar(sub('^0+','',sub('\\.','',x))); 
## [1] 1 2 4 0 

, sonra tüm şeritler kullanabilirsiniz önde gelen sıfırlar ve son olarak dize uzunluğunu anlamlı basamak sayısının hesaplanması dolaylı bir araç olarak kullanır. Sıfır girdisi için doğal olarak sıfır döndürür, ancak bu durumda açık bir şekilde sınamak için bir if ifadesini kullanabilir ve tercih ederseniz, bunun yerine bir tane döndürürsünüz. akrun ondalık sonra iki hane ile baskı için, belirtildiği gibi,

: ('% 2f', v1) (v1, nsmall = 2) 'baskı ya da' sprintf için

sprintf('%.2f',x); 
## [1] "0.90" "0.81" "32.52" "0.00" 
6

ondalık sonra basamak saymak için olmak istiyorum, sen nchar

sapply(v, nchar) - 2 # -2 for "." and leading 0 
# 1 2 
Bu ondalık noktayı şeritler
+3

Veya 'nchar (alt ('. * \\.', '', V1))' BTW, nchar (v1) -2' de – akrun

+3

çalışmalıdır. Bunun genel olmadığını belirtmeniz gerekebilir. Örneğin, akrun dediği gibi '32.52' – akrun

+0

@akrun evet – jenesaisquoi