如何将数据框的某些列转换为因子?

mat*_*h11 39 numerical r factors

可能重复:
使用R识别或编码唯一因子

我和R有点麻烦

我有一个类似于以下的数据集,但更长.

A B Pulse
1 2 23
2 2 24
2 2 12
2 3 25
1 1 65
1 3 45
Run Code Online (Sandbox Code Playgroud)

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

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

救命?

Jef*_*len 49

这是一个例子:

#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"
Run Code Online (Sandbox Code Playgroud)

您还可以在读取数据时处理此问题.请参阅例如colClassesstringsAsFactors参数readCSV().

请注意,从计算上来说,对这些列进行分解对您没有多大帮助,实际上可能会使您的程序变慢(尽管可以忽略不计).使用因子将要求所有值都映射到幕后的ID,因此data.frame的任何打印都需要在这些级别上进行查找 - 这需要花费时间.

当存储您不想重复存储的字符串但更愿意通过其ID引用时,因素很棒.考虑在这些列中存储更友好的名称,以充分受益于因素.

  • 尝试运行上面的代码,然后将`levels`值分配给更有用的东西.例如,`levels(d $ a)< - c("Long","Short")`.现在,您(或查看代码的新用户)无需担心记住ID和标签之间的映射.R将为您处理映射并只向您显示标签. (2认同)

Ric*_*rta 27

鉴于以下示例

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

然后

myData$A <-as.factor(myData$A)
myData$B <-as.factor(myData$B)
Run Code Online (Sandbox Code Playgroud)

或者你可以完全选择你的列并很好地包装它:

# 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")
Run Code Online (Sandbox Code Playgroud)

获得

> 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
Run Code Online (Sandbox Code Playgroud)