我有一些麻烦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会将它们视为数值变量。 我需要使用因子函数将这些变量转换为因子。
帮助?
我有一些麻烦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会将它们视为数值变量。 我需要使用因子函数将这些变量转换为因子。
帮助?
下面是一个例子:
#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"
在数据读取时,也可以处理这个问题。例如参见例如colClasses
和stringsAsFactors
参数。 readCSV()
。
请注意,在计算上,考虑这样的列并不会对您有太大帮助,并且实际上可能会减慢程序的速度(尽管可以忽略)。使用一个因子将要求所有值都映射到幕后的ID,因此任何print.frame数据都需要在这些级别上查找 - 这是需要花费时间的额外步骤。
存储不想重复存储的字符串时,因素非常好,但宁可参考其ID。考虑在这些列中存储更友好的名称,以充分受益于因素。
但是每个数字都代表着某种东西。对于A,1代表长,2代表短。对于B,1 2 3代表,1公斤,2公斤,3公斤所以我需要将所有的1,2等转换为1公斤,2公斤,长,短等我需要添加标签。 – math11
尝试运行上面的代码,然后将'levels'值分配给更有用的值。例如,'levels(d $ a)< - c(“Long”,“Short”)'。现在,您(或者一位新用户在查看您的代码)不必担心记忆您的ID和您的标签之间的映射。 R将为您处理映射,并向您展示标签。 –
样本数据
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
如果回答了您的问题,您可以指定一个复选标记。 –