【问题标题】:Replacing several elements in R替换 R 中的几个元素
【发布时间】:2014-07-19 04:46:40
【问题描述】:

假设我有一个向量

dat <- c("A", "B", "C", "B", "A", "E", "E", "F", "D", "D", "A", 
         "C", "C", "E", "F", "B", "F", "E", "C", "D", "B", "A")

我将如何替换:

  • 所有“A”值都变为“D”
  • 所有“B”值都变为“E”
  • 所有“C”值都变为“F”。

我意识到我可以通过在 R 中使用 match 或 which 函数来实现这一点,但我想在一行中完成所有这些,而且效率也很高。

【问题讨论】:

  • 你试过什么?为什么一定要一行?为什么我们要忽略引号的缺失?
  • 我不想在每个矢量元素周围写这么多引号。它必须是一行,因为我给出了一个非常简化的实际问题示例。我真正的(也是更复杂的)问题涉及大约 30 次替换。为什么我要写 30 个 which 或 match 语句?看起来很傻。而且我已经尝试了替换功能,特别是尝试将具有必须位于(A,B,C)的元素的向量映射到它将变成(D,E,F)
  • 所以我基本上尝试了 replace(dat, c("A", "B", "C"), c("D", "E", "F)),但它没有无法正常工作。
  • 提供最小样本很好;但它应该是可运行的。这只是意味着回答问题的人需要花时间引用引号来测试任何可能的解决方案。
  • 好吧,我会加引号的。

标签: r


【解决方案1】:

有一个解决方案,在一行中。

chartr(old="ABC", new="DEF", dat)

【讨论】:

  • 谢谢,一个简单优雅的解决方案,只有一行。只是一个快速方便的功能,您可以在此过程中学习 :)
  • @user3562276,另一个有用的函数(如果你不喜欢这样的例子的引号)是scandat &lt;- scan(what = "", text = "A B C B A").
  • 其实我前几天才注意到这个功能。很有用。
  • 不错。来自 Java,很高兴看到这么多内置的方法来帮助懒惰的人,而 Java 中的语法非常紧凑,在我看来 R 更加宽松。
【解决方案2】:

utf8ToInt 和 intToUtf8 分别将字符与 inters 进行转换。由于 A、B、C 到 D、E、F 都是三个字母的距离,所以可以通过转换成整数、加三、再转换回来的方式来实现,如下:

> vUtf8ToInt <- Vectorize(utf8ToInt)
> vIntToUtf8 <- Vectorize(intToUtf8)
> 
> data <- c("A", "B", "C")
> 
> vIntToUtf8(vUtf8ToInt(data) + 3)
  A   B   C 
"D" "E" "F" 

请注意,这些函数本身并不作用于向量,因此必须先进行向量化。

【讨论】:

    【解决方案3】:
    dat <- substitute(expression(A, B, C, B, A, E, E, F, D, D, A, C, C, E, F, B, F, E, C, D, B, A), 
                      list(A="D", B="E", C="F") )
    dat
    # expression("D", "E", "F", "E", "D", E, E, F, D, D, "D", "F", 
    #    "F", E, F, "E", F, E, "F", D, "E", "D")
    

    【讨论】:

      【解决方案4】:

      尝试以下方法:

      > library(car)
      > recode(dat, "'A'='D'; 'B'='E'; 'C' = 'F'")
      [1] "D" "E" "F"
      

      【讨论】:

      • 固体。它可以工作,但我必须安装第三方库。还有其他方法吗?就我自己的知识而言,尽管这样可以完成工作。
      【解决方案5】:

      我假设您将使用dat 作为一个因素。所以给定向量

      dat <- c("A", "B", "C", "B", "A", "E", "E", "F", "D", "D", "A", "C", "C", "E", "F", "B", "F", "E", "C", "D", "B", "A")
      

      你可以用

      重新编码一个因子的某些水平
      datf<-factor(dat)
      levels(datf)<-list("D"="A", "E"="B", "F"="C")
      

      然后datf 将包含

       [1] D E F E D E E F D D D F F E F E F E F D E D
      Levels: D E
      

      【讨论】:

        【解决方案6】:

        您还可以:

        ifelse(dat %in% c("A","B","C"), c(A="D", B="E", C="F")[dat], dat)
        #[1] "D" "E" "F" "E" "D" "E" "E" "F" "D" "D" "D" "F" "F" "E" "F" "E" "F" "E" "F"
        #[20] "D" "E" "D"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-25
          • 2014-11-20
          • 1970-01-01
          • 2011-02-15
          • 1970-01-01
          • 2012-01-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多