标签因素和保持数值
labelling factors and keeping numerical values
我在创建数值和 "label" 都可以引用的因子时遇到了一些问题。
据说 lfactors 包可以做到这一点,但我一直无法执行它。所以,这就是我所做的:
library(lfactors)
cars <- mtcars
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
如果我们查看 "carb" 列(可能反映碳排放量),它是一个数字
所以我使用 lfactors 包对其进行了改造:
cars$carb <- lfactor(c(1:4),
levels = c(1:4),
labels = c("low", "medium", "high", "extreme" ))
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: Factor w/ 4 levels "low","medium",..: 1 2 3 4 1 2 3 4 1 2 ..
我注意到根据包裹描述,它变成了一个因素,所以我做了检查
levels(cars$carb)
[1] "low" "medium" "high" "extreme" # correct
cars$carb == "medium"
[1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE
[23] FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE # correct
cars$carb == 2
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # incorrect
我仍然无法通过级别和值来引用该因素,所以我想知道是否有人以前使用过这个包或者有任何替代方案的建议?
一个接近的选择,但不完全是
尽管它并不完美,因为我无法通过值和标签来引用这些因素,但我找到了一种至少允许我存储两者的方法,我认为这可能对处于我位置的其他人有用:
library(sjlabelled)
library(magrittr)
library(sjmisc)
cars <- mtcars
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
frq(cars$carb)
x <numeric>
# total N=32 valid N=32 mean=2.81 sd=1.62
val frq raw.prc valid.prc cum.prc
1 7 21.88 21.88 21.88
2 10 31.25 31.25 53.12
3 3 9.38 9.38 62.50
4 10 31.25 31.25 93.75
6 1 3.12 3.12 96.88
8 1 3.12 3.12 100.00
NA 0 0.00 NA NA
这就是我们以数字形式得到的,转换为因子保留预期形式:
cars$carb <- as_factor(cars$carb)
str(cars$carb)
Factor w/ 6 levels "1","2","3","4",..: 4 4 1 1 2 1 4 2 2 4 ...
frq(cars$carb)
<categorical>
# total N=32 valid N=32 mean=2.81 sd=1.62
val frq raw.prc valid.prc cum.prc
1 7 21.88 21.88 21.88
2 10 31.25 31.25 53.12
3 3 9.38 9.38 62.50
4 10 31.25 31.25 93.75
6 1 3.12 3.12 96.88
8 1 3.12 3.12 100.00
NA 0 0.00 NA NA
现在我们有了分类形式的它,我们可以标记值(在这个例子中我将忽略 6 和 8)
cars$carb<- set_labels(
cars$carb,
labels = c(
`1` = "low",
`2` = "medium",
`3` = "high",
`4` = "extreme"
))
frq(cars$carb)
<categorical>
# total N=32 valid N=32 mean=2.81 sd=1.62
val label frq raw.prc valid.prc cum.prc
1 low 7 21.88 21.88 21.88
2 medium 10 31.25 31.25 53.12
3 high 3 9.38 9.38 62.50
4 extreme 10 31.25 31.25 93.75
6 6 1 3.12 3.12 96.88
8 8 1 3.12 3.12 100.00
NA <NA> 0 0.00 NA NA
现在我们可以同时看到标签和值,但是,根据标签调用数据仍然存在问题
cars[cars$carb==1,]
mpg cyl disp hp drat wt qsec vs am gear carb
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
cars[cars$carb=="low",]
[1] mpg cyl disp hp drat wt qsec vs am gear carb
<0 rows> (or 0-length row.names)
任何关于因子标签的建议以及通过标签和值调用因子的方法都将不胜感激。与此同时,我希望我的替代方案有所帮助。
你一开始就发出了一点嘘声
cars$carb <- lfactor(c(1:4), ...)
应该是
cars$carb <- lfactor(cars$carb, ...)
检查:
> mtcars$carb=="medium"
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE
[25] TRUE FALSE TRUE TRUE FALSE NA NA TRUE
> mtcars$carb==2
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE
[25] TRUE FALSE TRUE TRUE FALSE NA NA TRUE
> all((mtcars$carb=="medium")==(mtcars$carb==2), na.rm=TRUE)
[1] TRUE
我有点惊讶 cars$carb <- lfactor(c(1:4), ...)
没有触发错误,或者至少没有触发警告。所以我做了实验:
mtcars$carb <- lfactor(c(1:5),
levels = c(1:4),
labels = c("low", "medium", "high", "extreme" ))
Error in `$<-.data.frame`(`*tmp*`, carb, value = c(1L, 2L, 3L, 4L, NA)) :
replacement has 5 rows, data has 32
这让我觉得正在使用 R 的回收规则,尽管有人可能会争辩说 R 应该 至少 对不正确的命令发出警告。类似于:"Warning: recycling vector to match length of dim(cars)[1]"
不管有没有错误,也没有警告,你(OP)接着说:
"I noticed that it changed to a factor, as per the package
description, so I did my checks"
我会把新向量制成表格,因为我并不总是相信自己的编码能力,而且每当您对数据进行任何更改时,这始终是一个好习惯。类似于:
> table(cars$carb)
low medium high extreme
8 8 8 8
可能已经足够了。那会发出警钟响起,因为您会意识到原始 carb
变量包含 6 个级别,而不是 4 个,并且这些级别具有相同的频率计数。然后您可能已经弄清楚您之前的命令出了什么问题。
我不熟悉 lfactor 包。我不明白为什么 lfactor
函数没有为您原来的错误命令分配数字级别。如果您 运行 llevels
函数,它 returns NULL,这就是为什么您对每个元素使用数值 returns FALSE 进行比较。
llevels(cars$carb)
NULL
感谢@Edward,在提供的指导下,我能够自由发挥并让 lfactor 函数按照我的意愿运行。
将 lfactor 应用于多列时出现问题
将函数应用于数据数组(而不是单个命名对象;即 cars[9:11] 而不是 cars$carb,它将向量转换为字符而不是向量
cars <- mtcars
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
cars[,9:11] <- lfactor(cars[,9:11],
levels = c(1:4),
labels = c("low", "medium", "high", "extreme"))
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : chr NA NA NA NA ...
$ gear: chr NA NA NA NA ...
$ carb: chr NA NA NA NA ...
这个问题的解决方案
在尝试了自制函数、apply 和许多其他命令之后,我想到的解决方案是使用 for 循环:
vars <- c("am", "gear", "carb")
for(i in vars){
cars[,i] <- lfactor(cars[,i],
levels = c(1:4),
labels = c("low", "medium", "high", "extreme"))
}
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : Factor w/ 4 levels "low","medium",..: 1 1 1 NA NA NA NA NA NA NA ...
..- attr(*, "llevels")= int 1 2 3 4
$ gear: Factor w/ 4 levels "low","medium",..: 4 4 4 3 3 3 3 4 4 4 ...
..- attr(*, "llevels")= int 1 2 3 4
$ carb: Factor w/ 4 levels "low","medium",..: NA NA NA NA NA NA NA NA NA NA ...
..- attr(*, "llevels")= int 1 2 3 4
这也让我可以通过标签或值调用对象
head(cars$gear==3)
[1] FALSE FALSE FALSE TRUE TRUE TRUE
head(cars$gear=="high")
[1] FALSE FALSE FALSE TRUE TRUE TRUE
我希望这 post 能帮助其他可能与我有类似情况的人
再次感谢爱德华!
我在创建数值和 "label" 都可以引用的因子时遇到了一些问题。
据说 lfactors 包可以做到这一点,但我一直无法执行它。所以,这就是我所做的:
library(lfactors)
cars <- mtcars
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
如果我们查看 "carb" 列(可能反映碳排放量),它是一个数字
所以我使用 lfactors 包对其进行了改造:
cars$carb <- lfactor(c(1:4),
levels = c(1:4),
labels = c("low", "medium", "high", "extreme" ))
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: Factor w/ 4 levels "low","medium",..: 1 2 3 4 1 2 3 4 1 2 ..
我注意到根据包裹描述,它变成了一个因素,所以我做了检查
levels(cars$carb)
[1] "low" "medium" "high" "extreme" # correct
cars$carb == "medium"
[1] FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE
[23] FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE # correct
cars$carb == 2
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[23] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE # incorrect
我仍然无法通过级别和值来引用该因素,所以我想知道是否有人以前使用过这个包或者有任何替代方案的建议?
一个接近的选择,但不完全是
尽管它并不完美,因为我无法通过值和标签来引用这些因素,但我找到了一种至少允许我存储两者的方法,我认为这可能对处于我位置的其他人有用:
library(sjlabelled)
library(magrittr)
library(sjmisc)
cars <- mtcars
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
frq(cars$carb)
x <numeric>
# total N=32 valid N=32 mean=2.81 sd=1.62
val frq raw.prc valid.prc cum.prc
1 7 21.88 21.88 21.88
2 10 31.25 31.25 53.12
3 3 9.38 9.38 62.50
4 10 31.25 31.25 93.75
6 1 3.12 3.12 96.88
8 1 3.12 3.12 100.00
NA 0 0.00 NA NA
这就是我们以数字形式得到的,转换为因子保留预期形式:
cars$carb <- as_factor(cars$carb)
str(cars$carb)
Factor w/ 6 levels "1","2","3","4",..: 4 4 1 1 2 1 4 2 2 4 ...
frq(cars$carb)
<categorical>
# total N=32 valid N=32 mean=2.81 sd=1.62
val frq raw.prc valid.prc cum.prc
1 7 21.88 21.88 21.88
2 10 31.25 31.25 53.12
3 3 9.38 9.38 62.50
4 10 31.25 31.25 93.75
6 1 3.12 3.12 96.88
8 1 3.12 3.12 100.00
NA 0 0.00 NA NA
现在我们有了分类形式的它,我们可以标记值(在这个例子中我将忽略 6 和 8)
cars$carb<- set_labels(
cars$carb,
labels = c(
`1` = "low",
`2` = "medium",
`3` = "high",
`4` = "extreme"
))
frq(cars$carb)
<categorical>
# total N=32 valid N=32 mean=2.81 sd=1.62
val label frq raw.prc valid.prc cum.prc
1 low 7 21.88 21.88 21.88
2 medium 10 31.25 31.25 53.12
3 high 3 9.38 9.38 62.50
4 extreme 10 31.25 31.25 93.75
6 6 1 3.12 3.12 96.88
8 8 1 3.12 3.12 100.00
NA <NA> 0 0.00 NA NA
现在我们可以同时看到标签和值,但是,根据标签调用数据仍然存在问题
cars[cars$carb==1,]
mpg cyl disp hp drat wt qsec vs am gear carb
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
cars[cars$carb=="low",]
[1] mpg cyl disp hp drat wt qsec vs am gear carb
<0 rows> (or 0-length row.names)
任何关于因子标签的建议以及通过标签和值调用因子的方法都将不胜感激。与此同时,我希望我的替代方案有所帮助。
你一开始就发出了一点嘘声
cars$carb <- lfactor(c(1:4), ...)
应该是
cars$carb <- lfactor(cars$carb, ...)
检查:
> mtcars$carb=="medium"
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE
[25] TRUE FALSE TRUE TRUE FALSE NA NA TRUE
> mtcars$carb==2
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE
[13] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE
[25] TRUE FALSE TRUE TRUE FALSE NA NA TRUE
> all((mtcars$carb=="medium")==(mtcars$carb==2), na.rm=TRUE)
[1] TRUE
我有点惊讶 cars$carb <- lfactor(c(1:4), ...)
没有触发错误,或者至少没有触发警告。所以我做了实验:
mtcars$carb <- lfactor(c(1:5),
levels = c(1:4),
labels = c("low", "medium", "high", "extreme" ))
Error in `$<-.data.frame`(`*tmp*`, carb, value = c(1L, 2L, 3L, 4L, NA)) :
replacement has 5 rows, data has 32
这让我觉得正在使用 R 的回收规则,尽管有人可能会争辩说 R 应该 至少 对不正确的命令发出警告。类似于:"Warning: recycling vector to match length of dim(cars)[1]"
不管有没有错误,也没有警告,你(OP)接着说:
"I noticed that it changed to a factor, as per the package description, so I did my checks"
我会把新向量制成表格,因为我并不总是相信自己的编码能力,而且每当您对数据进行任何更改时,这始终是一个好习惯。类似于:
> table(cars$carb)
low medium high extreme
8 8 8 8
可能已经足够了。那会发出警钟响起,因为您会意识到原始 carb
变量包含 6 个级别,而不是 4 个,并且这些级别具有相同的频率计数。然后您可能已经弄清楚您之前的命令出了什么问题。
我不熟悉 lfactor 包。我不明白为什么 lfactor
函数没有为您原来的错误命令分配数字级别。如果您 运行 llevels
函数,它 returns NULL,这就是为什么您对每个元素使用数值 returns FALSE 进行比较。
llevels(cars$carb)
NULL
感谢@Edward,在提供的指导下,我能够自由发挥并让 lfactor 函数按照我的意愿运行。
将 lfactor 应用于多列时出现问题
将函数应用于数据数组(而不是单个命名对象;即 cars[9:11] 而不是 cars$carb,它将向量转换为字符而不是向量
cars <- mtcars
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
cars[,9:11] <- lfactor(cars[,9:11],
levels = c(1:4),
labels = c("low", "medium", "high", "extreme"))
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : chr NA NA NA NA ...
$ gear: chr NA NA NA NA ...
$ carb: chr NA NA NA NA ...
这个问题的解决方案
在尝试了自制函数、apply 和许多其他命令之后,我想到的解决方案是使用 for 循环:
vars <- c("am", "gear", "carb")
for(i in vars){
cars[,i] <- lfactor(cars[,i],
levels = c(1:4),
labels = c("low", "medium", "high", "extreme"))
}
str(cars)
'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : Factor w/ 4 levels "low","medium",..: 1 1 1 NA NA NA NA NA NA NA ...
..- attr(*, "llevels")= int 1 2 3 4
$ gear: Factor w/ 4 levels "low","medium",..: 4 4 4 3 3 3 3 4 4 4 ...
..- attr(*, "llevels")= int 1 2 3 4
$ carb: Factor w/ 4 levels "low","medium",..: NA NA NA NA NA NA NA NA NA NA ...
..- attr(*, "llevels")= int 1 2 3 4
这也让我可以通过标签或值调用对象
head(cars$gear==3)
[1] FALSE FALSE FALSE TRUE TRUE TRUE
head(cars$gear=="high")
[1] FALSE FALSE FALSE TRUE TRUE TRUE
我希望这 post 能帮助其他可能与我有类似情况的人
再次感谢爱德华!