R語(yǔ)言:實(shí)現(xiàn)因子與字符串的互轉(zhuǎn)
在導(dǎo)入大批量數(shù)據(jù)時(shí),如果沒有顯式地指定“stringsAsFactors = FALSE”,默認(rèn)會(huì)將所有的字符串轉(zhuǎn)換為因子,導(dǎo)致數(shù)據(jù)處理速度較慢。
示例數(shù)據(jù)如下:
name,math,english,sex,year "yiifaa",65,68,"M",2018 "yiifee",95,98,"F",2018 "guagua",75,78,"M",2018 "MM",85,88,"F",2018
查看數(shù)據(jù)概要,發(fā)現(xiàn)默認(rèn)將字符串轉(zhuǎn)換為因子,并進(jìn)行了分組計(jì)數(shù)(這也是處理速度較慢的原因之一)
概要如下:
name math english sex year
guagua:1 Min. :65.0 Min. :68.0 F:2 Min. :2018
MM :1 1st Qu.:72.5 1st Qu.:75.5 M:2 1st Qu.:2018
yiifaa:1 Median :80.0 Median :83.0 Median :2018
yiifee:1 Mean :80.0 Mean :83.0 Mean :2018
3rd Qu.:87.5 3rd Qu.:90.5 3rd Qu.:2018
Max. :95.0 Max. :98.0 Max. :2018
但這樣的分組計(jì)數(shù)并沒有意義,所以需要利用“as.character”轉(zhuǎn)換為字符,如下:
#! /usr/bin/env RScript
setwd("D:/Workspace/R-Works/R-Stat")
scores <- read.table("Score.txt", header = TRUE, sep = ",", quote="\"", encoding = "UTF-8", stringsAsFactors = TRUE)
# 將因子轉(zhuǎn)換為字符
scores$name <- as.character(scores$name)
# 多轉(zhuǎn)一個(gè)進(jìn)行測(cè)試
scores$sex <- as.character(scores$sex)
再次查看概要,如下:
name math english sex year
Length:4 Min. :65.0 Min. :68.0 Length:4 Min. :2018
Class :character 1st Qu.:72.5 1st Qu.:75.5 Class :character 1st Qu.:2018
Mode :character Median :80.0 Median :83.0 Mode :character Median :2018
Mean :80.0 Mean :83.0 Mean :2018
3rd Qu.:87.5 3rd Qu.:90.5 3rd Qu.:2018
Max. :95.0 Max. :98.0 Max. :2018
可以看到,概要中已經(jīng)沒有了分組計(jì)數(shù),但多了總數(shù)計(jì)量,如果要恢復(fù)分組計(jì)數(shù),則需要重新創(chuàng)建因子,如下:
scores$sex <- factor(scores$sex, levels=c("M", "F"), ordered = TRUE)
結(jié)論
在導(dǎo)入大批量數(shù)據(jù)時(shí),為了提高性能,盡可能分兩步走:
1. 顯式指定“stringsAsFactors = FALSE”;
2. 依次將所需要的數(shù)據(jù)列(向量)轉(zhuǎn)換為因子;
補(bǔ)充:R語(yǔ)言:變量名稱和字符串的轉(zhuǎn)換
在R語(yǔ)言中,經(jīng)常會(huì)遇到變量名稱和字符串相互轉(zhuǎn)換的問(wèn)題。
比如說(shuō),進(jìn)行1000次循環(huán)運(yùn)算,并將運(yùn)算結(jié)果存儲(chǔ)在1000個(gè)變量中,如x_1, x_2, ... , x_1000。這時(shí)候可以使用assign()函數(shù),示例如下:
> a
錯(cuò)誤: 找不到對(duì)象'a'
> assign('a', 1)
> a
[1] 1
上面的例子將字符'a'轉(zhuǎn)變?yōu)樽兞縜,并將其賦值為1 。
相反,如果我們想遍歷一個(gè)變量序列,并對(duì)其中的每一個(gè)變量都進(jìn)行操作,該怎么辦呢?我們可以使用get()函數(shù)。示例如下:
> a <- 1
> b <- 2
> c <- 3
> sequence <- c('a', 'b', 'c')
> for (var in sequence){print(var + 10)}
錯(cuò)誤于var + 10 : 二進(jìn)列運(yùn)算符中有非數(shù)值參數(shù)
> for (var in sequence){print(get(var) + 10)}
[1] 11
[1] 12
[1] 13
我們可以發(fā)現(xiàn),get函數(shù)將字符var轉(zhuǎn)變?yōu)樽兞浚⒏鶕?jù)變量的值進(jìn)行后續(xù)操作。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
R語(yǔ)言中dnorm,pnorm,qnorm和rnorm的區(qū)別淺析
正在學(xué)習(xí)R語(yǔ)言統(tǒng)計(jì)學(xué)的小伙伴,可能會(huì)被各種專有名詞所困擾,下面這篇文章主要給大家介紹了關(guān)于R語(yǔ)言中dnorm,pnorm,qnorm和rnorm區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-12-12
R語(yǔ)言運(yùn)算符知識(shí)點(diǎn)講解
在本篇文章里小編給大家分享了一篇關(guān)于R語(yǔ)言運(yùn)算符知識(shí)點(diǎn)講解內(nèi)容,有興趣的朋友們可以參考下。2021-03-03
Rcpp和RcppArmadillo創(chuàng)建R語(yǔ)言包的實(shí)現(xiàn)方式
這篇文章主要為大家介紹了Rcpp和RcppArmadillo創(chuàng)建R包實(shí)現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11
R語(yǔ)言中corrplot標(biāo)題居中及eps格式輸出
由于論文的需要,很多R語(yǔ)言繪圖需要eps格式矢量圖的方式進(jìn)行輸出,同時(shí)最近也需要繪制相關(guān)性圖,因此決定寫個(gè)博客作為記錄,有需要的朋友可以借鑒參考下2021-11-11
R語(yǔ)言which函數(shù)介紹及Rcpp改寫詳解
有的時(shí)候我們需要找到一個(gè)數(shù)據(jù)子向量中的位置,我們就可以使用which函數(shù),下面這篇文章主要給大家介紹了關(guān)于R語(yǔ)言which函數(shù)介紹及Rcpp改寫的相關(guān)資料,需要的朋友可以參考下2022-07-07
R語(yǔ)言邏輯型運(yùn)算的實(shí)現(xiàn)
本文主要介紹了R語(yǔ)言邏輯型運(yùn)算,邏輯型是 R 的基本數(shù)據(jù)類型之一,只有兩個(gè)值 TRUE 和 FALSE, 缺失時(shí)為 NA,具有一定的參考價(jià)值,感興趣的可以了解一下2022-03-03

