在R中,如何设置和保留不同标签的自定义级别?

问题描述 投票:1回答:2

在R中,如何设置和保留不同标签的自定义级别?

也就是说,我想在一个因子的级别设置自定义数字,并且这些数值 - 要保留的整数而不是转换为“1,2,3等”。

我知道一种解决方案是将这些权重设置为标签,但之后我将错过该因子的“标签”。

不保留因子之间的“加权”距离。在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因子中不存在这种情况,那么通过自定义函数很容易产生这样的结果吗?

r integer r-factor levels
2个回答
1
投票

您可以使用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


0
投票

我找到了一个解决方法,以便使用我分配给它们的自定义值来保留因子的级别:

解决方法是将因子级别“粘贴”到因子标签上,然后使用函数将它们分成两个不同的df。

这相当于从头开始创建两个不同的数据集/数据框,一个具有因子标签,另一个具有相应的级别。

但是,如果您不想设置“两次”变量,这可能不太实用。

因此,我相信,它增加了操纵因素的清晰度。您将所有必要的信息放在一个地方。如果您有需要,可以通过创建两个不同的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
  • 您可能有一个列表,一些因素

附:你知道我可以在哪里贡献自制的R功能吗?您是否知道开放协作或积极搜索天真级别的贡献者的软件包?

© www.soinside.com 2019 - 2024. All rights reserved.