【问题标题】:Add a new level to a factor and substitute existing one向因子添加新水平并替换现有水平
【发布时间】:2011-10-27 16:55:54
【问题描述】:

我在处理数据框的级别名称时遇到了很大的麻烦。

我有一个大数据框,其中一个列是具有很多级别的因素。

问题是其中一些数据是重复的,我分析的下一步不接受重复的数据。所以我需要更改重复关卡的名称,以便继续下一步。

让我举个小例子:

假设我们有一个包含一列的简单数据框:

> df
col_foo
1   bar1
2   bar2
3   bar3
4   bar2
5   bar4
6   bar5
7   bar3

如果我们查看该列,我们会发现它是一个具有 5 个不同级别的因子。

>df$col_foo
[1] bar1 bar2 bar3 bar2 bar4 bar5 bar3
Levels: bar1 bar2 bar3 bar4 bar5

好的,问题来了。看到bar2bar3 级别重复。我想知道的是如何添加一个级别名称,例如bar2_X,并且只替换重复的名称。所以数据框应该变成这样:

> df
col_foo
1   bar1
2   bar2
3   bar3
4   bar2_X
5   bar4
6   bar5
7   bar3_X

这可能吗?我无法更改列的类,它应该仍然是一个因素,因此需要更改它的解决方案无法解决我的问题,除非可以再次强制因素。

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    在您的专栏中使用unique = TRUE 致电make.names

    df$col_foo <- factor(make.names(df$col_foo, unique = TRUE))
    

    【讨论】:

    • 这是一个非常有用的提示!谢谢!但就我而言,我真的想添加一个后缀来区分,“.1”非常通用,因为我正在处理一些名称中已经包含它们的代码,例如:ENST00000381184.1
    【解决方案2】:

    如果您希望所有条目都是唯一的,那么仅使用字符变量并不会为您带来太多好处。

    可能最简单的方法是强制转换为字符向量,使用duplicated 函数查找重复项并将某些内容粘贴到它们的末尾,然后如果您想使用factor 重新转换它回到一个因素。可能是这样的:

    df$col_foo <- factor( ifelse( duplicated(df$col_fo), 
                        paste(df$col_foo, '_x', sep=''), as.character(df$col_foo)))
    

    【讨论】:

    • +1 提醒我们为什么我们首先使用因子。
    • 这将是做我想做的事的完美方式,但不知何故这也改变了非重复关卡的名称,所以我得到:> df col_foo 1 1 2 2 3 3 4 bar2_x 5 4 6 5 7 bar3_x
    • 将 else 部分包裹在 as.character 中,我在示例中修复了这个问题。
    • 是的!这正是我所需要的!非常感谢@GregSnow!
    • @Lianzinho: 有没有一个因子水平出现3次或更多的实例? (检查table(df$col_foo)。)如果是这样,带有_X 后缀的值将不是唯一的。
    【解决方案3】:

    您可以编辑因子变量的水平:

    levels(df$col_foo) <- c(levels(df$col_foo),"bar2_X","bar3_X")
    

    然后将重复的关卡更改为您添加的新关卡之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-09-17
      相关资源
      最近更新 更多