如何将数据框中的特定列转换为因子变量?

44

可能是重复问题:
如何使用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有1、2、3表示3个不同时刻。

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

需要帮助吗?

2个回答

60

这里有一个例子:

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

在读取数据时,您也可以处理此问题。请参阅readCSV()中的colClassesstringsAsFactors参数。

请注意,在计算方面,因子化这样的列帮助不大,实际上可能会减慢程序的速度(尽管微不足道)。使用因子将要求将所有值映射到幕后的ID上,因此数据框的任何打印都需要在这些级别上进行查找——这需要时间。

当存储不想重复存储但宁愿按其ID引用的字符串时,因子非常有用。考虑在这些列中存储更友好的名称以充分受益于因子。


但是每个数字都代表着某些东西。对于A,1代表长,2代表短。对于B,1 2 3分别代表1kg、2kg、3kg。因此我需要将所有的1、2等数字转换为1kg、2kg、长、短等文字形式,并加上标签。 - math11
3
尝试运行上面的代码,然后将levels的值分配给更有用的内容。例如,levels(d$a) <- c("Long", "Short")。现在你(或查看你的代码的新用户)无需担心记忆ID和标签之间的映射关系。R将为您处理映射,并只向您呈现标签。 - Jeff Allen
Jeff是一个更完整的解决方案,因为它可以在同一命令中添加级别。 - Juano

33

鉴于以下示例

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接