參考資料:學習R
????????文本數據存儲在字符向量中。重要的是,字符向量中的每個元素都是字符串,而非單獨的字符。
? ? ? ? 文本的基本單位是字符向量,著意味著大部分字符串處理函數也能用于字符向量。
1、創建和打印字符串
? ? ? ? 字符向量可用c函數創建。我們可以用單引號或雙引號把字符串引起來,只要引號之間匹配即可。建議使用雙引號。
? ? ? ? paste函數能將不同字符串組合起來。在它傳入的參數向量中,每個元素都能夠自我循環以達到最長的矢量長度,然后字符串就被拼接在一起,中間以空格分開。可以使用參數sep更改分隔符,或使用相關的paste0函數去掉分隔符。所有的字符串組合后,可使用collapse參數把結果收縮成一個包含所有元素的字符串。
paste(c("red","yellow"),"lorry")
paste(c("red","yellow"),"lorry",sep="-")
paste(c("red","yellow"),"lorry",collapse=", ")
paste0(c("red","yellow"),"lorry")
? ? ? ? toString函數是paste的變種,它在打印向量時非常有用。它使用逗號和空格分隔每個元素,且可限制打印的數量。
x<-(1:15)^2
toString(x)
toString(x,width=40)
? ? ? ? cat是一個低級函數,很少直接調用它
? ? ? ? 通常情況下,當字符串打印到控制臺時,它們會議雙引號括起來。如果對它們使用noquote函數,就可以去掉這些引號。有時,這會使文本更具可讀性。
x<-c("I","saw","a","saw","that","could","out","saw","any","other","saw","I","ever","saw")
y<-noquote(x)
print(x)
print(y)
2、格式化數字
? ? ? ? 有幾個函數可用于數字的格式化。formatC可以讓我們用C語言的格式化風格來指定使用固定型或科學型的格式、小數的位數以及輸出的寬度。無論使用哪種選項,輸入都應該是numeric類型,且輸出是character字符向量或數組:
pow<-1:3
powers_of_e<-exp(pow)
formatC(powers_of_e)
# 指定3個數字
formatC(powers_of_e,digits=3)
# 前面加上空格
formatC(powers_of_e,digits=3,width=10)
# 科學格式
formatC(powers_of_e,digits=3,format="e")
# 前面加上+
formatC(powers_of_e,digits=3,flag="+")
? ? ? ? R還提供了更通用的C風格的格式化函數sprintf。與sprintf在其他語言中的工作方式一眼:第一個參數包含字符串或數字變量的占位符,其他參數則將逐個代入這些占位符。不過請注意,R中大部分的數值是浮點型的而非整數型的。
? ? ? ? sprintf的第一個參數指定了一個格式化字符串,其中包括其他值得占位符。例如:%s代表另一個字符串,%f和%e分別代表固定型格式和科學型格式的浮點數,%d表示整數。其他參數的值將替換占位符。與paste函數類似,較短長度的輸入將循環自身以匹配最長的輸入。
sprintf("%s %d = %f","Euler's constant to the power",pow,powers_of_e)
sprintf("To three decimal places, e ^ %d = %.3f",pow,powers_of_e)
sprintf("In scientific notation, e ^ %d = %e",pow,powers_of_e)
? ? ? ? 其他格式化數字的方法有format和prettyNum兩個函數。format提供的格式化字符串的語法與formatC的用法基本類似。而prettyNum則非常適合于格式化那些非常大火非常小的數字:
format(powers_of_e)
# 保留2位小數
format(powers_of_e,digits=3)
# 去掉多余的0
format(powers_of_e,digits=3,trim=TRUE)
# 保留兩位小數的科學計數
format(powers_of_e,digits=3,scientific = TRUE)
# 使用prettyNum函數
prettyNum(c(1e10,1e-20),big.mark = ",",small.mark = " ",preserve.width = "individual",scientific=FALSE
)
3、特殊字符
? ? ? ? 有一些特殊字符可以被包含在字符串中。例如,我們可以通過\t插入一個制表符。在下例中,我們使用cat而非print,因為print執行的額外轉換動作會把制表符\t轉換成反斜杠和一個t。cat的參數fill=TRUE使光標在一行結束后移動到下一行:
cat("foo\tbar",fill=TRUE)
? ? ? ? 將光標移動到下一行是通過打印換行符\N完成的(在R中,不要使用\r或\r\n來打印換行符,因為\r會將光標移動到當前行的開始并覆蓋我們所寫的內容);
cat("foo\nbar",fill=TRUE)
? ? ? ? 打印反斜杠時需要連續輸入兩個反斜杠,以免被誤認為是特殊字符:
cat("foo\\bar",fill=TRUE)
? ? ? ? 如果我們需要在字符串中使用雙引號,那么雙引號前必須添加一個反斜杠來轉義。同樣,如果我們要在字符串中使用單引號,則單引號需要被轉義:
cat("foo'bar",fill=TRUE)
cat("foo\'bar",fill=TRUE)
cat("foo\"bar",fill=TRUE)
? ? ? ? 與之相反,如果在被雙引號引用的字符串中使用單引號,或在單引號引用的字符串中使用雙引號,則并不需要對其進行轉義。
? ? ? ? 通過打印警報符\a能讓我們的電腦發出提示音,不過alarm函數也能完成此功能且可讀性更好。當想要程序在一個耗時很長的分析任務結束后主動通知我們,可以使用這個函數。
4、更改大小寫
? ? ? ? 使用toupper和tolower函數能把字符串中的字符全部轉換為大寫或小寫:
toupper("I'm Shouting")
tolower("I'm Whispering")
5、截取字符串
? ? ? ? 有兩個函數可以用于從字符串中截取子串:substring和substr。在大多數情況下,我們可以任意使用其中一個。不過,如果我們傳入了不同長度的向量參數,它們的行為會略有不同。對substring來說,輸出的長度與最長的輸入一樣;而對于substr函數來說,輸出的長度只與第一個輸入的相等:
woodchuck<-c("How much wood would a woodchuck chuck","If a woodchuck could chuck wood","He would chuck, he would, as much as he could","And chuck as much wood as a woodchuck would","If a woodchuck could chuck wood."
)
substring(woodchuck,1:6,10)
substr(woodchuck,1:6,10)
6、分割字符串
? ? ? ? paste及其相關函數能把字符串組合起來。strsplit則正好相反,它在指定的某些點上分割字符串。我們可以把上例中的字符串按照空格分開。在下面,fixed=TRUE意味著split的參數是固定長度的字符串而非正則表達式:
strsplit(woodchuck," ",fixed=TRUE)
? ? ? ? 注意,strsplit返回的是列表(而非字符向量或矩陣)。這是因為它的結果可能由不同長度的字符向量組成。
? ? ? ? 在我們的例子中,某些詞最后的逗號有些煩人。最好的方法是在空格分割符前加一個可選的逗號,使用正則表達式就很容易搞定,?意味著“前面的字符可選”:
strsplit(woodchuck,",? ")
7、文件路徑
? ? ? ? R有一個工作目錄,默認為文件被讀寫的地方。我們可以使用getwd查看它的位置,并使用setwd來改變它:
getwd()
setwd("C:/users/...")
? ? ? ? 這里需要注意,每個路徑的目錄部分由正斜杠分隔。我們也可以使用雙反斜杠來表示Windows的路徑,不過正斜杠仍為首選。
? ? ? ? 我們可以使用file.path來從各個目錄中創建文件路徑。它會自動地在目錄名稱之間插入正斜杠:
file.path("C:","Program Files","R","R-devel")
? ? ? ? 路徑可以是絕對路徑(從驅動器名稱或網絡共享處開始)或相對路徑(相對于當前工作目錄)。在后一種情況中,.用于當前目錄,..用于父目錄,~代表當前用戶主目錄。path.expand能將相對路徑轉換為絕對路徑:
path.expand(".")
path.expand("..")
path.expand("~")
? ? ? ? basename只返回文件名,而不包括前面的目錄位置。與之相反,dirname只返回文件的目錄。
file_name <- "C:/Program Files/R/R-devel/bin/x64/RGui.exe"
basename(file_name)
dirname(file_name)