43

可能重复:
使用 R 识别或编码独特因素

我在使用 R 时遇到了一些问题。

我有一个类似于以下的数据集,但要长得多。

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

基本上,前 2 列已编码。A有 1, 2 代表 2 个不同的权重。 B有 1, 2, 3 代表 3 个不同的时间。

由于它们是编码的数值,R 会将它们视为数值变量。我需要使用因子函数将这些变量转换为因子。

帮助?

4

2 回答 2

59

这是一个例子:

#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"

您也可以在读取数据时处理此问题。参见eg中的colClassesand参数。stringsAsFactorsreadCSV()

请注意,在计算上,分解此类列对您没有多大帮助,并且实际上可能会减慢您的程序(尽管可以忽略不计)。使用因子将要求所有值都映射到幕后的 ID,因此任何打印的 data.frame 都需要在这些级别上进行查找——这是一个需要时间的额外步骤。

存储不想重复存储但更愿意通过其 ID 引用的字符串时,因素非常有用。考虑在此类列中存储更友好的名称以充分受益于因素。

于 2012-11-28T20:38:01.700 回答
32

给定以下示例

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
于 2012-11-28T20:41:19.347 回答