【问题标题】:"replace" function examples“替换”函数示例
【发布时间】:2012-08-02 09:44:06
【问题描述】:

我没有发现base 包中的replace 函数的帮助页面非常有用。最糟糕的是,它没有可以帮助理解其工作原理的示例。

你能解释一下如何使用它吗?一两个例子会很棒。

【问题讨论】:

    标签: r


    【解决方案1】:

    这里有两个简单的例子

    > x <- letters[1:4]
    > replace(x, 3, 'Z') #replacing 'c' by 'Z'
    [1] "a" "b" "Z" "d"
    > 
    > y <- 1:10
    > replace(y, c(4,5), c(20,30)) # replacing 4th and 5th elements by 20 and 30
     [1]  1  2  3 20 30  6  7  8  9 10
    

    【讨论】:

      【解决方案2】:

      如果您查看该函数(通过在控制台输入它的名称),您会发现它只是[&lt;- 函数的简单功能化版本,在?"[" 中进行了描述。 [ 是 R 的一个相当基本的功能,因此建议您查看该页面以获取更多详细信息。尤其重要的是要了解索引参数(replace 中的第二个参数可以是逻辑、数字或字符分类值。当第二个和第三个参数的长度不同时会发生回收:

      您应该将函数调用“解读”为“在第一个参数中,使用第二个参数作为将第三个参数的值放入第一个参数的索引”:

      > replace( 1:20, 10:15, 1:2)
       [1]  1  2  3  4  5  6  7  8  9  1  2  1  2  1  2 16 17 18 19 20
      

      命名向量的字符索引:

      > replace(c(a=1, b=2, c=3, d=4), "b", 10)
       a  b  c  d 
       1 10  3  4 
      

      逻辑索引:

      > replace(x <- c(a=1, b=2, c=3, d=4), x>2, 10)
       a  b  c  d 
       1  2 10 10 
      

      【讨论】:

        【解决方案3】:

        你也可以使用逻辑测试

        x <- data.frame(a = c(0,1,2,NA), b = c(0,NA,1,2), c = c(NA, 0, 1, 2)) 
        x
        x$a <- replace(x$a, is.na(x$a), 0)
        x
        x$b <- replace(x$b, x$b==2, 333)
        

        【讨论】:

          【解决方案4】:

          请注意,上面给出的示例中的第三个参数(值):该值是一个常数(例如 'Z' 或 c(20,30))。

          使用数据框本身的值定义第三个参数可能会导致混淆。

          例如使用这样的简单数据框(使用 dplyr::data_frame):

          tmp <- data_frame(a=1:10, b=sample(LETTERS[24:26], 10, replace=T))
          

          这将创建类似这样的东西:

                 a     b
             (int) (chr)
          1      1     X
          2      2     Y
          3      3     Y
          4      4     X
          5      5     Z
          

          ..等

          现在假设您想做的是将“a”列中的值乘以 2,但仅在“b”列是“X”的情况下。我的直接想法是这样的:

          with(tmp, replace(a, b=="X", a*2))
          

          但是,这不会提供预期的结果。 a*2 将定义为固定向量,而不是对“a”列的引用。因此,向量 'a*2' 将是

          [1]  2  4  6  8 10 12 14 16 18 20
          

          在“替换”操作开始时。因此,'b' 等于 "X" 的第一行,'a' 中的值将被 2 放置。第二次,它将被 4 替换,等等......它不会被替换两次-the-value-of-a 在该特定行中。

          【讨论】:

            【解决方案5】:

            这是一个示例,我发现 replace( ) 函数有助于我深入了解。该问题需要将长整数向量转换为字符向量,并将其整数替换为给定的字符值。

            ## figuring out replace( )
            (test <- c(rep(1,3),rep(2,2),rep(3,1)))
            

            看起来像

            [1] 1 1 1 2 2 3
            

            我想用 A 替换每个 1,用 B 替换 2,用 C 替换 3

            letts <- c("A","B","C")
            

            所以在我自己的秘密小“脏诗”中,我使用了循环

            for(i in 1:3)
            {test <- replace(test,test==i,letts[i])}
            

            我想做的事

            test
            [1] "A" "A" "A" "B" "B" "C"
            

            在第一句话中,我故意省略了真正的目标是使整数的大向量成为因子向量,并为整数值(级别)分配一些名称(标签)。

            因此,这里执行 replace() 应用程序的另一种方法是

            (test <- factor(test,labels=letts))
            [1] A A A B B C
            Levels: A B C
            

            【讨论】:

            • c(rep(1,3),rep(2,2),rep(3,1)) 可以简化为rep(1:3, 3:1)
            • 我很欣赏你的诗歌!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-02-13
            • 1970-01-01
            • 1970-01-01
            • 2013-02-25
            • 2022-01-22
            相关资源
            最近更新 更多