2012-11-28 97 views
25

可能重複:
identifying or coding unique factors using R轉換變量因素中的R

我有一些麻煩R.

我有一個數據集類似於以下,但更長。

A B Pulse 
1 2 23 
2 2 24 
2 2 12 
2 3 25 
1 1 65 
1 3 45 

基本上,前兩列是編碼的。 A有1,2代表2個不同的權重。 B具有代表3個不同時間的1,2,3。

由於它們是編碼的數值,R會將它們視爲數值變量。 我需要使用因子函數將這些變量轉換爲因子。

幫助?

+0

如果回答了您的問題,您可以指定一個複選標記。 –

回答

38

下面是一個例子:

#Create a data frame 
> d<- data.frame(a=1:3, b=2:4) 
> d 
    a b 
1 1 2 
2 2 3 
3 3 4 

#currently, there are no levels in the `a` column, since it's numeric as you point out. 
> levels(d$a) 
NULL 

#Convert that column to a factor 
> d$a <- factor(d$a) 
> d 
    a b 
1 1 2 
2 2 3 
3 3 4 

#Now it has levels. 
> levels(d$a) 
[1] "1" "2" "3" 

在數據讀取時,也可以處理這個問題。例如參見例如colClassesstringsAsFactors參數。 readCSV()

請注意,在計算上,考慮這樣的列並不會對您有太大幫助,並且實際上可能會減慢程序的速度(儘管可以忽略)。使用一個因子將要求所有值都映射到幕後的ID,因此任何print.frame數據都需要在這些級別上查找 - 這是需要花費時間的額外步驟。

存儲不想重複存儲的字符串時,因素非常好,但寧可參考其ID。考慮在這些列中存儲更友好的名稱,以充分受益於因素。

+0

但是每個數字都代表着某種東西。對於A,1代表長,2代表短。對於B,1 2 3代表,1公斤,2公斤,3公斤所以我需要將所有的1,2等轉換爲1公斤,2公斤,長,短等我需要添加標籤。 – math11

+2

嘗試運行上面的代碼,然後將'levels'值分配給更有用的值。例如,'levels(d $ a)< - c(「Long」,「Short」)'。現在,您(或者一位新用戶在查看您的代碼)不必擔心記憶您的ID和您的標籤之間的映射。 R將爲您處理映射,並向您展示標籤。 –

19

樣本數據

myData <- data.frame(A=rep(1:2, 3), B=rep(1:3, 2), Pulse=20:25) 



myData$A <-as.factor(myData$A) 
myData$B <-as.factor(myData$B) 

,或者你可以乾脆選擇列,並很好地包起來:

# select columns 
cols <- c("A", "B") 
myData[,cols] <- data.frame(apply(myData[cols], 2, as.factor)) 

levels(myData$A) <- c("long", "short") 
levels(myData$B) <- c("1kg", "2kg", "3kg") 

如:

> myData 
     A B Pulse 
1 long 1kg 20 
2 short 2kg 21 
3 long 3kg 22 
4 short 1kg 23 
5 long 2kg 24 
6 short 3kg 25