2012-11-28 66 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