【问题标题】:Revise content of string factor using 'ifelse' isn't working [duplicate]使用“ifelse”修改字符串因子的内容不起作用[重复]
【发布时间】:2020-07-15 13:48:47
【问题描述】:

Kia ora 数据科学社区,在尝试修改数据框架因子的内容时,我很难让 ifelse 声明起作用。我正在使用 5 种不同类型的陷阱类型,但其中两种陷阱类型没有被正确总结。以下是陷阱类型和与每种类型相关的观察数量的汇总表:

 DOC150 Double (Fiordland)        DOC150 Single (ATBT) 
                     107748                       20260 
      DOC150 Single (ATBT)  DOC200 Double (Run Through) 
                        456                        2324 
     DOC200 Double (Takaka)         DOC200 Double (ZIP) 
                      23748                        2472 
     DOC200 Single (Takaka)     DOC200 Single (Takaka)  
                      11258                       23668

我需要将 DOC150 Single (ATBT) 陷阱识别为相同并进行总结,DOC200 Single (Takaka) 也是如此。无论出于何种原因,陷阱类型都被总结为单独的类别;我怀疑从更大的数据集中提取信息时,名称的间距有问题。

我尝试使用以下代码重新分类错误的陷阱类型之一,但无济于事:类别仍然存在,但代码将所有陷阱类型从字符因子更改为数字因子和最终计数对于每个类别保持不变。

Records2$TrapName<- as.character(ifelse(grepl("Single (Takaka)", Records2$TrapTypeTe), "DOC200 Single (Takaka)", Records2$TrapTypeTe))

这是生成的汇总表:

     1      2      3      4      5      6      7      8 
107748  20260    456   2324  23748   2472  11258  23668

我以为我终于明白如何在ifelse 语句中使用grepl,但现在我被卡住了。我知道如何在 SAS 中执行此操作,但 R 让我陷入了困境。任何帮助将不胜感激。起亚派到 ra,道格

【问题讨论】:

  • 看看是否有一些空格可以区分它们。试试Records2$TrapName &lt;- trimws(df$Records2$TrapTypeTe)
  • 什么是Kia ora 数据科学社区? :)
  • Kia ora = 毛利语你好...我猜您可以弄清楚“数据科学社区”的含义... ;-)
  • 这是使用因子使事情变得更容易的时候之一,因为您立即知道您有什么拼写错误/大写问题。如果TrapeTypeTe 是一个因素,那么级别是多少?更改标签很容易,并且会自动解决问题。
  • Ronak Shah,修剪没有帮助;类别仍然以相同的方式总结。

标签: r if-statement character grepl


【解决方案1】:

正如 cmets 中所述,问题是由于列值中有额外的空间。您可以使用trimws 删除它,并且不需要ifelsegrepl

Records2$TrapTypeTe <- trimws(Records2$TrapTypeTe)
#Check
table(Records2$TrapTypeTe)

【讨论】:

    【解决方案2】:

    这是一种使用因子的方法 - 我们不小心在代码中包含了一些小写字母:

    x <- c("D", "B", "E", "e", "A", "a", "E", "E", "E", "D", "E", "D", 
    "d", "A", "A", "b", "D", "D", "B", "C", "e", "b", "D", "d", "D")
    table(x)
    x
    # a A b B C d D e E 
    # 1 3 2 2 1 2 7 2 5 
    x <- factor(x)
    levels(x)
    # [1] "a" "A" "b" "B" "C" "d" "D" "e" "E"
    levels(x) <- c("A", "A", "B", "B", "C", "D", "D", "E", "E")
    table(x)
    # x
    # A B C D E 
    # 4 4 1 9 7 
    levels(x)
    # [1] "A" "B" "C" "D" "E"
    

    【讨论】:

    • dcarlson...我明白了。我运行了levels(Records2$TrapTypeTe),我看到这两个表现不佳的关卡在它们的值末尾有额外的空格。 Ronak Shah,我运行了您修改后的代码(创建了新因素)并解决了问题。非常感谢,伙计们!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2021-07-29
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多