2012-08-04 19 views
26

我没有找到replace功能的帮助页面,从base包到非常有帮助。最糟糕的是,它没有任何可以帮助理解它如何工作的例子。替换函数示例

您能否解释一下如何使用它?一个或两个例子会很棒。

回答

30

如果你看一下功能(通过键入在控制台上的名字),你会看到,它只是[<-功能的一个简单的功能化版本,它在?"["描述。 [对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 
8

这里有两个简单的例子

> 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 
11

您还可以使用逻辑测试

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) 
1

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

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

E.g.用一个简单的数据帧像这样(使用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等等......它不会被两次取代在特定行中的a值。