2015-06-04 53 views
3

分隔千我想格式化數字,這樣每千應該用空格隔開。如何與空間

我已經試過:

library(magrittr) 
addSpaceSep <- function(x) { 
    x %>% 
    as.character %>% 
    strsplit(split = NULL) %>% 
    unlist %>% 
    rev %>% 
    split(ceiling(seq_along(.)/3)) %>% 
    lapply(paste, collapse = "") %>% 
    paste(collapse = " ") %>% 
    strsplit(split = NULL) %>% 
    unlist %>% 
    rev %>% 
    paste(collapse = "") 
} 

> sapply(c(1, 12, 123, 1234, 12345, 123456, 123456, 1234567), addSpaceSep) 
[1] "1"   "12"  "123"  "1 234"  "12 345" "123 456" "123 456" 
[8] "1 234 567" 
> sapply(c(1, 10, 100, 1000, 10000, 100000, 1000000), addSpaceSep) 
[1] "1"  "10"  "100" "1 000" "10 000" "1e +05" "1e +06" 

我感覺很不好寫了這個臨時的功能,但我還沒有掌握正則表達式,這是我發現這樣做的唯一途徑。當然,如果數字以科學的格式轉換,它將無法工作。

+0

我能問你爲什麼要做這個?它主要用於_display_還是主要用於_manipulation_(即,您是否試圖製作一個每千之間有空格的漂亮報告,或者您是否嘗試在R中執行一些不尋常的數學運算?)? – TARehman

+0

這只是爲了美觀的目的! –

+0

確實是重複的。但我認爲這不應該結束。我不是一個非常好的英語溝通者,因此有時很難找到你在找什麼(因爲我只找到一個C解決方案..)。具有不同標題的這個問題可以允許其他用戶在他們使用不同的搜索條件時找到解決方案! (和避免他們發表自己丑陋的臨時功能;)) –

回答

12

這似乎是一個更加適合的format()函數,而不是正則表達式的困擾。該format()函數存在格式化數字

format(c(1, 12, 123, 1234, 12345, 123456, 123456, 1234567), big.mark=" ", trim=TRUE) 
# [1] "1"   "12"  "123"  "1 234"  "12 345" "123 456" 
# [7] "123 456" "1 234 567" 
format(c(1, 10, 100, 1000, 10000, 100000, 1000000), big.mark=" ", scientific=FALSE, trim=TRUE) 
# [1] "1"   "10"  "100"  "1 000"  "10 000" "100 000" 
# [7] "1 000 000" 
+0

哇...我經常在日期中使用這個函數...但我不知道所有這些論點!謝謝。 –

10
x<-100000000 
prettyNum(x,big.mark=" ",scientific=FALSE) 
[1] "100 000 000" 
7

我與其他的答案,使用其他工具(如format)是最好的方法達成一致。但是,如果你真的想要使用正則表達式和替換,那麼這是一種使用Perl的前瞻性方法。

> test <- c(1, 12, 123, 1234, 12345, 123456, 1234567, 12345678) 
> 
> gsub('(\\d)(?=(\\d{3})+(\\D|$))', '\\1 ', 
+  as.character(test), perl=TRUE) 
[1] "1"   "12"   "123"  "1 234"  
[5] "12 345"  "123 456" "1 234 567" "12 345 678" 

基本上它查找後跟1組或更多組的3個位數(後面跟一個非數字或字符串的末尾)的一個數字,並用本身加上的空間替換位(的向前看部分不會出現在替換中,因爲它不是比賽的一部分,更多的是比賽的條件)。