在 R 中,如何设置和保留不同标签的自定义级别?
in R, how to set and retain custom levels in factor with different labels?
在 R 中,如何在具有不同标签的因子中设置和保留自定义级别?
也就是说,我想在一个因子的水平上设置自定义数字,这些数值-要保留的整数,而不是转换为“1、2、3 等”。
我知道一种解决方案是将这些权重设置为标签,但这样我就会漏掉因子的 "labels"。
不保留因子之间的 "weighted" 距离。是否有可能在 R 中使用单个变量实现类似的目的?
例如:
age_f <- factor( c(1, 10, 100), levels = c( 1, 10, 100 ), labels = c( "baby", "child", "old" ), ordered = T )
levels(age_f)
[1] "baby" "child" "old"
labels(age_f)
[1] "1" "2" "3"
labels(levels(age_f))
[1] "1" "2" "3"
as.numeric(age_f)
[1] 1 2 3
Desired output:
as.numeric(age_f)
[1] 1 10 100
如果R因子中不存在这个,自定义函数很容易产生这样的结果?
您可以为此使用 labelled
包。
library(labelled)
labelled(c(1, 10, 100), c(baby = 1, child = 10 , old = 100))
<Labelled double>
[1] 1 10 100
Labels:
value label
1 baby
10 child
100 old
如果您稍后想将其转换为常规因子,可以使用 to_factor
。
我找到了一个变通方法,以便使用我分配给它们的自定义值来保留因子的水平:
解决方法是"paste"将因子的水平添加到因子的标签中,然后用一个函数将它们分成两个不同的df。
这等同于从一开始就创建两个不同的数据集/数据框,一个带有因子标签,另一个带有相应的水平。
但是,如果您不想设置 "two times" 您的变量,这可能不太实用。
因此,我认为,它增加了操纵因素的清晰度。您将所有必要的信息集中在一个地方。
如果你有需要,你可以通过创建两个不同的dfs来将它们分开。
# Example Factor:
age_f <- factor( ordered( 1:3 ), labels = c( "1 Infant", "10 Child", "100 Old" ) )
# The Function
Leveling_Labels <- function( factors, split_arg = " " ) {
leveling_Labels <- list()
for( i in 1:length( factors ) ) {
splits <- strsplit( as.character( factors[[i]] ), split_arg )
leveling_Labels[[i]] <- as.numeric( unlist( lapply( 1:length( splits ), function(x) splits[[x]][1] ) ) )
levels( factors[[i]] ) <- unlist( lapply( 1:length( splits ), function(x) splits[[x]][2] ) )
}
results <- c( factors, leveling_Labels )
results
}
- 产生的因素:
age_f
[1] 1 Infant 10 Child 100 Old
Levels: 1 Infant < 10 Child < 100 Old
- 运行 将因子与其水平分开的函数:
Leveling_Labels( list( age_f ), " ")
[[1]]
[1] Infant Child Old
Levels: Infant < Child < Old
[[2]]
[1] 1 10 100
- 您可能有许多因素
p.s。你知道我在哪里可以贡献这样的自制 R 函数吗?您知道开放协作或积极搜索天真的贡献者的软件包吗?
在 R 中,如何在具有不同标签的因子中设置和保留自定义级别?
也就是说,我想在一个因子的水平上设置自定义数字,这些数值-要保留的整数,而不是转换为“1、2、3 等”。
我知道一种解决方案是将这些权重设置为标签,但这样我就会漏掉因子的 "labels"。
不保留因子之间的 "weighted" 距离。是否有可能在 R 中使用单个变量实现类似的目的?
例如:
age_f <- factor( c(1, 10, 100), levels = c( 1, 10, 100 ), labels = c( "baby", "child", "old" ), ordered = T )
levels(age_f) [1] "baby" "child" "old" labels(age_f) [1] "1" "2" "3" labels(levels(age_f)) [1] "1" "2" "3" as.numeric(age_f) [1] 1 2 3 Desired output: as.numeric(age_f) [1] 1 10 100
如果R因子中不存在这个,自定义函数很容易产生这样的结果?
您可以为此使用 labelled
包。
library(labelled)
labelled(c(1, 10, 100), c(baby = 1, child = 10 , old = 100))
<Labelled double>
[1] 1 10 100
Labels:
value label
1 baby
10 child
100 old
如果您稍后想将其转换为常规因子,可以使用 to_factor
。
我找到了一个变通方法,以便使用我分配给它们的自定义值来保留因子的水平:
解决方法是"paste"将因子的水平添加到因子的标签中,然后用一个函数将它们分成两个不同的df。
这等同于从一开始就创建两个不同的数据集/数据框,一个带有因子标签,另一个带有相应的水平。
但是,如果您不想设置 "two times" 您的变量,这可能不太实用。
因此,我认为,它增加了操纵因素的清晰度。您将所有必要的信息集中在一个地方。 如果你有需要,你可以通过创建两个不同的dfs来将它们分开。
# Example Factor: age_f <- factor( ordered( 1:3 ), labels = c( "1 Infant", "10 Child", "100 Old" ) )
# The Function
Leveling_Labels <- function( factors, split_arg = " " ) {
leveling_Labels <- list()
for( i in 1:length( factors ) ) {
splits <- strsplit( as.character( factors[[i]] ), split_arg )
leveling_Labels[[i]] <- as.numeric( unlist( lapply( 1:length( splits ), function(x) splits[[x]][1] ) ) )
levels( factors[[i]] ) <- unlist( lapply( 1:length( splits ), function(x) splits[[x]][2] ) )
}
results <- c( factors, leveling_Labels )
results
}
- 产生的因素:
age_f
[1] 1 Infant 10 Child 100 Old Levels: 1 Infant < 10 Child < 100 Old
- 运行 将因子与其水平分开的函数:
Leveling_Labels( list( age_f ), " ")
[[1]] [1] Infant Child Old Levels: Infant < Child < Old [[2]] [1] 1 10 100
- 您可能有许多因素
p.s。你知道我在哪里可以贡献这样的自制 R 函数吗?您知道开放协作或积极搜索天真的贡献者的软件包吗?