【问题标题】:Recode/relevel data.frame factors with different levels重新编码/重新调整不同级别的 data.frame 因子
【发布时间】:2010-02-26 15:00:55
【问题描述】:

每次我必须重新编码一组变量时,我都会考虑使用 SPSS 重新编码功能。我必须承认这很简单。 car 包中有一个类似的 recode 函数,它可以解决问题,但我们假设我想用 factor 完成任务。

我有 data.frame 有几个变量,值范围从 1 到 7。我想“反转”变量值,因此用 7s 替换 1s,用 6s 替换 2s,用 5s 替换 3s 等。我可以利用 factor 函数:

# create dummy factor
set.seed(100)
x <- as.factor(round(runif(100,1,7)))
y <- factor(x, levels = rev(levels(x)))

如果我跑步:

> levels(x)
[1] "1" "2" "3" "4" "5" "6" "7"
> levels(y)
[1] "7" "6" "5" "4" "3" "2" "1"

当我想重新编码不具有​​相等水平的因素时,问题就开始了。如果某个因子 z 的级别为 c("1", "3", "4", "6", "7"),我是否有机会通过使用 factor 函数“反转”级别,例如 1=7、2=6、3=5 等?

其他高效的重新编码功能就足够了!

【问题讨论】:

    标签: r levels


    【解决方案1】:

    您必须为 factor 提供 levels 参数(正如 Dirk 所写):

    set.seed(2342472)
    ( x <- round(runif(10,1,7)) )
    #  [1] 7 5 5 3 1 2 5 3 3 2
    ( xf <- as.factor(x) )
    # [1] 7 5 5 3 1 2 5 3 3 2
    # Levels: 1 2 3 5 7
    ( yf <- factor(x,levels=7:1) )
    # [1] 7 5 5 3 1 2 5 3 3 2
    # Levels: 7 6 5 4 3 2 1
    

    你也可以在现有因素上这样做

    ( yxf <- factor(xf,levels=7:1) )
    # [1] 7 5 5 3 1 2 5 3 3 2
    #Levels: 7 6 5 4 3 2 1
    

    如您所见,关卡按期望顺序扩展。

    【讨论】:

    • 感谢这个!看来我只是太累了,错过了显而易见的事情。解决方案如此简单......再次感谢!
    【解决方案2】:

    是的,只需分配给levels

    R> set.seed(100)
    R> x <- as.factor(round(runif(100,1,7)))
    R> table(x)
    x
     1  2  3  4  5  6  7 
     3 16 20 19 18 17  7 
    R> levels(x) <- LETTERS[1:7]
    R> table(x)
    x
     A  B  C  D  E  F  G 
     3 16 20 19 18 17  7 
    R> 
    

    【讨论】:

    • 我的问题似乎不太简洁。如果我有“不完整”的水平,例如c("2", "4", "5", "6") 通过反转它们我会得到 c("6", "5", "4", "2"),我不想要要做到这一点。我想替换值/级别,以便 1=7、2=6、3=5,反之亦然。因子/级别函数是否可行,还是我必须使用 car::recode()??
    【解决方案3】:

    如果你完成了因子水平,你就可以开始了:

    df <- data.frame(x=factor(c(2,4,5,6)))
    df$x <- factor(df$x, levels = 7:1)
    table(df$x)
    
    7 6 5 4 3 2 1 
    0 1 1 1 0 1 0 
    

    【讨论】:

      【解决方案4】:

      在这种情况下,既然你有数字,为什么不使用模运算来转换数字呢?

      例如

      levels(x) <- as.character((6*as.numeric(levels(x)))%%7+1)
      

      如果使用更大的范围,请适当修改 6 和 7。

      【讨论】:

      • 取模运算符(余数),类似于 C/Java 等中的 %,尽管我认为负值的处理方式不同。
      • 有趣...我试试看!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 2021-06-14
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      相关资源
      最近更新 更多